Python - Как использовать регулярные выражения, чтобы найти несколько слов и извлечь их одновременно - PullRequest
0 голосов
/ 25 января 2019

Используя Регулярное выражение, я хочу найти все совпадающие слова в предложении и извлечь нужную часть в совпадающих словах одновременно.

Я использую API "findall" из модуля "re", чтобы найти слова соответствия, а также скобки для извлечения нужных мне частей.

Например, у меня есть строка "0xQQ1A, 0xWW2B, 0xEE3C, 0xQQ4C". Мне нужны только два оставшихся слова после "0xQQ" или "0xWW", что приведет к появлению списка ["1A", "2B," 4C "].

Вот мой код:

import re

MyString = "0xQQ1A, 0xWW2B, 0xEE3C, 0xQQ4C"
MySearch = re.compile("0xQQ(\w{2})|0xWW(\w{2})")
MyList = MySearch.findall(MyString)

print MyList 

Итак, мой ожидаемый результат - ["1A", "2B," 4C "]. Но фактический результат [['1A', ''), ('', '2B'), ('4C', '')]

Я думаю, что мог использовать комбинацию "()" и "|" не в ту сторону. Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Вы можете попробовать это:

import re

string = "0xQQ1A, 0xWW2B, 0xEE3C, 0xQQ4C"
pattern = re.compile(r"(0xQQ|0xWW)(\w{2})")

result = [match[2] for match in pattern.finditer(string)]

result будет:

['1A', '2B', '4C']
0 голосов
/ 25 января 2019

Две разные группы захвата приведут к двум элементам на выходе (независимо от того, что соответствует каждой).

Вместо этого используйте одну группу захвата и поставьте | (ИЛИ) раньше:

re.compile("0x(?:QQ|WW)(\w{2})")

((?:...) - это группа без захвата , которая соответствует ... - используется для ограничения эффектов | только разделением QQ / WW, без добавления еще одного захвата квыходной.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...