Python使用re在字符之间创建空格,方括号中的字符除外

2024-06-16 22:12:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据框:

d1  ={'letters':['ABCDE[NOT]FGH', 'CCGF[NOT]HI', 'MPJ[NOT]L', 'MNA[NOT]PLJKAJSHD']}
df1 = pd.DataFrame(d1)

df1:

letters
0   ABCDE[NOT]FGH
1   CCGF[NOT]HI
2   MPJ[NOT]L
3   MNA[NOT]PLJKAJSHD

我想在每个字符之间创建一个空格,除了[]之间的空格

期望输出:

letters
0   A B C D E [NOT] F G H
1   C C G F [NOT] H I
2   M P J [NOT] L
3   M N A [NOT] P L J K A J S H D

我试过:

matching = re.sub(r'[^a-zA-Z []]+(?![^{]*})(\w)', r'\1', i)

df1['letters'].apply(lambda x: matching)

但这似乎不起作用。 有什么想法吗


Tags: 数据nothid1pddf1空格matching
3条回答

尽管效率极低,但您可以使用此选项并避免后期处理:

(?=(?!^)[^\[\]]*?\[|[^\[\]]+$)
  • (?=-开始一个前瞻
    • (?!^)-不要断言字符串的开头
    • [^\[\]]*?\[-断言任何指向开口括号的位置[
    • |-或
    • [^\[\]]+$-断言任何不是指向行末尾的括号的位置
  • )-关闭“向前看”

https://regex101.com/r/zoHEne/1/

注意:regex101示例仅因多行而具有尾随空格。一次测试一行,以确保没有尾随空格

您可以使用re.findall

import pandas as pd, re
d1 = {'letters':['ABCDE[NOT]FGH', 'CCGF[NOT]HI', 'MPJ[NOT]L', 'MNA[NOT]PLJKAJSHD']}
df1 = pd.DataFrame(d1)
df1['letters'] = df1['letters'].apply(lambda x:' '.join(re.findall('\[\w+\]|\w', x)))
                         letters
0          A B C D E [NOT] F G H
1              C C G F [NOT] H I
2                  M P J [NOT] L
3  M N A [NOT] P L J K A J S H D

您可以向每个[...]子字符串或字符串中找到的任何其他字符追加一个空格,然后rstrip返回结果:

>>> df1['letters'].str.replace(r'\[[^][]*]|.', r'\g<0> ', regex=True).str.rstrip()
0            A B C D E [NOT] F G H
1                C C G F [NOT] H I
2                    M P J [NOT] L
3    M N A [NOT] P L J K A J S H D
Name: letters, dtype: object

this regex demo

另一种方法是在与\[[^][]*]模式匹配的字符之外的任何字符周围添加空格,然后str.strip()返回结果:

>>> df1['letters'].str.replace(r'(\[[^][]*])|.', lambda x: x.group(1) if x.group(1) else f" {x.group()} ", regex=True).str.strip()
0                A  B  C  D  E [NOT] F  G  H
1                      C  C  G  F [NOT] H  I
2                            M  P  J [NOT] L
3    M  N  A [NOT] P  L  J  K  A  J  S  H  D
Name: letters, dtype: object

(\[[^][]*])|.正则表达式匹配并捕获到组1中的[,然后是除[]之外的任何零个或多个字符,然后是]字符,或除换行字符以外的任何字符,如果捕获到,则替换为组1值,否则替换为“空格”+匹配值+“空格”

如果替换操作中出现任何前导/尾随空格,则str.strip()将删除这些空格

相关问题 更多 >