python - 正则表达式单词在字符串中出现两次

标签 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 匹配。有什么提示这个正则表达式有什么问题吗?

最佳答案

定义正则表达式模式时使用原始字符串。 (请参阅第二段和第三段中的 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)]

关于python - 正则表达式单词在字符串中出现两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22645927/

相关文章:

python - 在函数之间建立多个持久 HTTP 连接

python - 在多线程中使用锁

regex - 正则表达式匹配以某个字符或空格开头然后是那个字符的行

PHP json_decode 一个 json_encoded 字符串

python - 检查字符串是否包含有效的正则表达式 python

python - 展开列条目并从 pandas 中的一行或多行添加值

python - Pandas 在同一列上聚合多个摘要

java - 适用于 Java、PHP 和 Python 的开源队列

php - 正则表达式从字符串中获取日期

javascript - 将正则表达式与 CoffeeScript 中的模板相匹配