Как искать / извлекать шаблоны в строке? - PullRequest
0 голосов
/ 22 мая 2019

У меня есть шаблон, который я хочу найти в своем сообщении.Шаблоны:

1. "aaa-b3-c"
2. "a3-b6-c"
3. "aaaa-bb-c"

Я знаю, как искать один из шаблонов, но как мне найти все 3?

Кроме того, как вы определяете и извлекаете даты в этом формате: 5/21 или 5/21 / 2019.

found = re.findall(r'.{3}-.{2}-.{1}', message)

Ответы [ 5 ]

1 голос
/ 22 мая 2019

Попробуйте это:

found = re.findall(r'a{2,4}-b{2}-c', message)
1 голос
/ 22 мая 2019

Первая часть может быть квантификатором {2,4} вместо 3. Точка соответствует любому символу, кроме новой строки, [a-zA-Z0-9] будет соответствовать верхнему или строчному символу az или цифре:

\b[a-zA-Z0-9]{2,4}-[a-zA-Z0-9]{2}-[a-zA-Z0-9]\b

Демо

Вы можете добавить границы слов \b или якоря ^ и $ с любой стороны, если символы не должны быть частью более длинного слова.

Для второго паттерна вы также можете использовать \d с квантификатором для совпадения с цифрой и дополнительным шаблоном для совпадения части с / и 4 цифрами:

\d{1,2}/\d{2}(?:/\d{4})?

Regex demo

Обратите внимание, что формат не проверяет саму дату.Возможно эта страница может помочь вам создать / настроить более точный формат даты.

0 голосов
/ 22 мая 2019

Здесь мы можем просто захотеть написать три выражения и смахнуть наши входы слева направо, чтобы быть в безопасности и соединить их, используя логические ИЛИ, и в случае, если у нас было больше шаблонов, мы можем просто добавить к ним, как:

([a-z]+-[a-z]+[0-9]+-[a-z]+)
([a-z]+[0-9]+-[a-z]+[0-9]+-[a-z])
([a-z]+-[a-z]+-[a-z])

, что добавило бы к:

([a-z]+-[a-z]+[0-9]+-[a-z]+)|([a-z]+[0-9]+-[a-z]+[0-9]+-[a-z])|([a-z]+-[a-z]+-[a-z])

Тогда, возможно, мы захотим связать его начальным и конечным символами:

^([a-z]+-[a-z]+[0-9]+-[a-z]+)$|^([a-z]+[0-9]+-[a-z]+[0-9]+-[a-z])$|^([a-z]+-[a-z]+-[a-z])$

или

^(([a-z]+-[a-z]+[0-9]+-[a-z]+)|([a-z]+[0-9]+-[a-z]+[0-9]+-[a-z])|([a-z]+-[a-z]+-[a-z]))$
* +1012 *enter image description here

RegEx

Если это выражение нежелательно, его можно изменить или изменить в regex101.com .

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

0 голосов
/ 22 мая 2019

попробуйте это:

re.findall(r'a.*-b.*-c',message)
0 голосов
/ 22 мая 2019

Вы можете использовать

a{2,4}-bb-c

в качестве шаблона.


Теперь вам нужно проверить соответствие на правдивость:
match = re.search(pattern, string)
if match:
    # do sth. here

Начиная с Python 3.8 вы можете использовать оператор walrus как в

if (match := re.search(pattern, string)) is not None:
    # do sth. here
...