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

标签 python regex python-re

我有一个数据框:

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/

相关文章:

python - 如何在谷歌云上运行我的 python 代码而不用担心断开连接——一个绝对的初学者?

python re.split函数,如何返回完整的字符集?

python - 在 python 中寻找 unicode 范围的补充

python - 如何将 unicode 文本转换为 python 可以读取的文本,以便我可以在网络抓取结果中找到该特定单词?

python - Django 序列化程序 : Getting an ordered dictionary in embeded serializer

python - 带共享 session 的 Django ORM 的 Tornado WebSocket

python - 将属性设置为类的属性,其中后者从类方法返回

python - 如何用正则表达式替换多个匹配项/组?

python - Is_prime 函数通过 python 中的正则表达式(来自 perl)

可选尾部斜杠的正则表达式匹配