我有一个数据框:
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)
但这似乎不起作用。 有什么想法吗?
最佳答案
您可以在每个 [...]
后面附加一个空格子字符串或字符串中找到的任何其他字符,然后 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 组 a [
,然后是 [
之外的任何零个或多个字符和]
然后是 ]
char,或除换行符之外的任何字符,如果捕获了组 1 值,则替换为组 1 值,否则替换为“空格”+ 匹配值 +“空格”。
str.strip()
删除替换操作中出现的前导/尾随空格(如果有)。
非 Pandas 代码
import re
# Solution 1
text = re.sub(r'\[[^][]*]|.', r'\g<0> ', text).rstrip()
# Solution 1
text = re.sub(r'(\[[^][]*])|.', lambda x: x.group(1) if x.group(1) else f" {x.group()} ", text).strip()
关于Python 使用 re 在字符之间创建空格(方括号中的字符除外),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68347687/