如何返回与重复模式匹配的整个非拉丁字符串,例如AAB或ABB

时间:2019-04-21 06:40:50

标签: python regex design-patterns non-latin

我正在使用非拉丁字符的字符串。 我想将字符串与重复模式匹配,例如AAB,ABB,ABAB等。 我尝试了以下代码:

import re

patternAAB = re.compile(r'\b(\w)\1\w\b')
match = patternAAB.findall(rawtext)
print(match) 

但是,它仅递归匹配字符串的第一个字符。 我知道发生这种情况是因为第一个\ w周围有括号。

我尝试在整个匹配的块周围添加捕获括号,但是Python提供了

error: cannot refer to an open group at position 7

我也找到了这种方法,但是对我不起作用:

patternAAB = re.compile(r'\b(\w)\1\w\b')
match = patternAAB.search(rawtext)
if match:
    print(match.group(1))

如何匹配模式并返回整个匹配字符串?

# Ex. 哈哈笑 
# string matches AAB pattern so my code returns 哈 
# but not the entire string

2 个答案:

答案 0 :(得分:1)

消息:

error: cannot refer to an open group at position 7

告诉您\1指的是周围带有括号的组,因为其开头的括号位于第一位。您要反向引用的组是2,因此此代码有效:

import re

rawtext = 'abc 哈哈笑 def'

patternAAB = re.compile(r'\b((\w)\2\w)\b')
match = patternAAB.findall(rawtext)
print(match)

match中的每个项目都有两个组:

[('哈哈笑', '哈')]

答案 1 :(得分:0)

  

我也找到了这种方法,但是对我不起作用:

您也靠近这里。您可以使用match.group(0)获得完整的匹配,而不仅仅是括号中的一组。因此此代码有效:

import re

rawtext = 'abc 哈哈笑 def'

patternAAB = re.compile(r'\b(\w)\1\w\b')
match = patternAAB.search(rawtext)
if match:
    print(match.group(0))   # 哈哈笑