正则表达式:替换字符串中的逗号,Python

3
一些关于在 Python 中正则表达式工作方式的疑惑,我想要替换所有在字符串中的逗号,这些逗号前面是字母,而且后面跟着另一个字母或者空格。例如:
2015,1674,240/09,PEOPLE V. MICHAEL JORDAN,15,15
2015,2135,602832/09,DOYLE V ICON, LLC,15,15

第一行有效地有6列,而第二行有7列。因此我试图将第二行中(N,L)之间的逗号替换为空格(N L),如下所示:

2015,2135,602832/09,DOYLE V ICON LLC,15,15

这是我到目前为止尝试过的,但都没有成功:

new_text = re.sub(r'([\w],[\s\w|\w])', "", text) 

有什么想法我是错了吗? 非常感谢您的帮助!
2个回答

7
您使用的模式是([\w],[\s\w|\w]),它在逗号前匹配并消耗一个单词字符(即字母数字或下划线,[\w]),然后匹配逗号,接着匹配(并再次消耗)1个字符——空格、单词字符或文字|(在字符类中,管道符被视为字面含义的管道符,而不是交替运算符)。
因此,主要问题在于\w匹配字母和数字两种字符。
实际上,您可以利用先行断言。
(?<=[a-zA-Z]),(?=[a-zA-Z\s])

参见正则表达式示例

(?<=[a-zA-Z])是一个正向后行断言,它要求在,之前必须是一个字母,而(?=[a-zA-Z\s])是一个正向前瞻,要求逗号右边必须有一个字母或空格。

以下是Python示例

import re
p = re.compile(r'(?<=[a-zA-Z]),(?=[a-zA-Z\s])')
test_str = "2015,1674,240/09,PEOPLE V. MICHAEL JORDAN,15,15\n2015,2135,602832/09,DOYLE V ICON, LLC,15,15"
result = p.sub("", test_str)
print(result)

如果您仍然想使用\w,您可以在否定的字符类中使用相反的类\W来排除数字和下划线:
(?<=[^\W\d_]),(?=[^\W\d_]|\s)

查看另一个正则表达式演示


感谢您花时间详细描述您的方法!我理解的方式是,[a-zA-Z]匹配字母,而[a-zA-Z\s]匹配字母或空格。但为什么不必使用|来表示或语句呢?其次,“?<=”和“?=”之间有什么区别?它是否匹配任何字母(一个或零个字符)和任何字母/空格(正好一个字符)? - calpyte
1)我不在[ 字符类 ](http://www.regular-expressions.info/charclass.html)中使用 |交替符号,因为它是不必要的,在正字符类中,默认为交替关系(即 [123] 匹配 123)。 2) (?<=...)(?=...)是[ ** 零宽度断言** ](http://www.regular-expressions.info/lookaround.html),请阅读链接页面-这些用于检查某种模式是否存在,如果缺少,则不会匹配。 - Wiktor Stribiżew
非常感谢您的澄清!我使用了您的正则表达式,它完美地运行。 - calpyte

0

\w 匹配 a-zA-Z0-9,因此您的正则表达式将替换所有逗号。您可以尝试以下正则表达式,并用 \1\2 进行替换。

([a-zA-Z]),(\s|[a-zA-Z])

这里是演示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接