正则表达式字符串两次

时间:2014-03-25 20:48:45

标签: python regex

我正在寻找一种方法来检测字符串中出现两次的所有大写单词(或部分单词)的位置。 示例 - 粗体显示我想要检测的位置:

  • 00004 ADC一些随机词 ADC 任何其他不相关的字符
  • 02某些CANIT CAN 任何其他无关的200
  • 399 ADC0 FLAG ADC0 更多单词adc

我有(并且似乎在在线正则表达式解析器中工作)是这个

p = re.compile('( [A-Z]{2,}[A-Z0-9]*).*(\1)')
match = p.search('0x0000 ADC asdf ADC')
print(match)

我尝试了不同的空白等变体,但这会产生Nonetype以进行匹配。任何暗示这个正则表达式有什么问题?

2 个答案:

答案 0 :(得分:2)

定义正则表达式模式时使用原始字符串。 (请参阅第二和第三段中的discussion of this issue以及raw string notation的说明)在您的情况下,'\1'被解释为单个字符chr(1)

In [173]: '\1'
Out[173]: '\x01'

In [181]: list('\1')
Out[181]: ['\x01']

然而,你想要两个字符,一个反斜杠后跟一个1:

In [180]: list(r'\1')
Out[180]: ['\\', '1']

In [176]: p = re.compile(r'( [A-Z]{2,}[A-Z0-9]*).*(\1)')

In [177]: p.search('0x0000 ADC asdf ADC')
Out[177]: <_sre.SRE_Match at 0xb439770>

请注意,如果您希望找到尽可能多的此类模式,请使用非贪婪的.*?代替.*

In [195]: [(match.start(), match.end()) for match in re.finditer(r'\b([A-Z]{2,}[A-Z0-9]*).*?(\1)', '0x0000 ADC asdf ADC0 ADC ADC0')]
Out[195]: [(7, 19), (21, 28)]

答案 1 :(得分:1)

\\1而非\1

p = re.compile('( [A-Z]{2,}[A-Z0-9]*).*(\\1)')
相关问题