0

我想在下面的字符串中搜索所有 '2' :

2, 10,11,1,1, 22,1,12,1,1, 1,2 , 2  ,2

我给出了正则表达式:

(^\s*(2)\s*)|(\s*,\s*(2)\s*(,|$))

但它不会搜索最后一个,而是一个 2


我现在将正则表达式更改为,

(^\s*(2)\s*)|(\s*,\s*(2)\s*)

但现在它需要22 中的 2 之一


如何更改正则表达式以便找到所有2(不应考虑22 或 12 )?

4

3 回答 3

1

使用否定的后视和否定的前瞻。

(?<!\d)2(?!\d)

演示

>>> import re
>>> s = "2, 10,11,1,1, 22,1,12,1,1, 1,2 , 2  ,2"
>>> re.findall(r'(?<!\d)2(?!\d)', s)
['2', '2', '2', '2']

解释:

  • (?<!\d)2Lookbehind 断言 the2前面将有任何但不是数字。
  • 2(?!\d)断言 2 后面必须跟任何但不是数字。
于 2014-10-15T05:17:43.450 回答
1

这将匹配2输入字符串中的所有独立项:

(?<!\d)2(?!\d)

上面的正则表达式等价于下面的正则表达式,因为它总是有相同数量的匹配,并且这个正则表达式中捕获组 1 的内容与另一个正则表达式匹配的内容相同:

(?:^|\D)(2)(?:\D|$)

请注意,上面的(两个)正则表达式不关心输入的格式。它只是简单地提取任何独立的 2,即使在:

2 plain text, 2,43_2,lkjsf
^             ^    ^

如果您想将列与 value 匹配,2而忽略or :22 2abc 2

(?:^|,) *(2) *(?=,|$)

它将与2此示例文本中的唯一匹配:

2 plain text, 2 ,2, 43_2, 2 2,2   ,234,2
              ^  ^            ^        ^
于 2014-10-15T05:22:38.337 回答
0

希望这是您正在寻找的

 [^\d]2[^\d]

http://regex101.com/r/nD6nZ9/1

python代码必须类似于

p = re.compile(ur'[^\d]2[^\d]', re.MULTILINE)
于 2014-10-15T05:14:51.927 回答