Как вернуть целые нелатинские строки, соответствующие шаблону дублирования, например, AAB или ABB - PullRequest
1 голос
/ 21 апреля 2019

Я работаю со строками нелатинских символов.Я хочу сопоставить строки с шаблонами дублирования, такими как 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 ]

1 голос
/ 21 апреля 2019

Сообщение:

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 имеет обе группы:

[('哈哈笑', '哈')]
0 голосов
/ 21 апреля 2019

Я также нашел этот метод, но у меня не работал:

Вы тоже были здесь близко. Вы можете использовать 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))   # 哈哈笑
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...