RegEx для сопоставления определенного шаблона в списке Python - PullRequest
1 голос
/ 20 мая 2019

Скажите, у меня есть следующий код:

import re
strings_of_text = ['data0', 'data23', 'data2', 'data55', 'data_mismatch', 'green']
strings_to_keep = []
expression_to_use = r'^\d{2}$|(?<=\s)\d{2}(?=\s)|(?<=\s)\d{2}$|^\d{2}(?=\s)'

for string in strings_of_text:
    # If the string is data#
    if (re.search(expression_to_use, string)):
        strings_to_keep.append(string)
print(strings_to_keep)

Где меня интересует только добавление строк с шаблоном «data», за которым следует некоторое число. Так что в этом случае я бы хотел добавить только 'data0', 'data23', 'data2', 'data55'

Как я могу это сделать? Я думаю, что мне нужно будет import re, но я не уверен, как его использовать.

Я прочитал это: Регулярное выражение Python ищет только две цифры

Но когда я пытаюсь изменить свое регулярное выражение, используя это выражение

^\d{2}$|(?<=\s)\d{2}(?=\s)|(?<=\s)\d{2}$|^\d{2}(?=\s)

Это не работает ... Вот где я застрял. Я новичок в использовании регулярных выражений, так что спасибо всем, кто публикует заранее

EDIT:

Вот результат, который я пытаюсь получить:

print(strings_to_keep)
>>> ['data0', 'data23', 'data2', 'data55']

Ответы [ 2 ]

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

В вашем паттерне вы используете 4 чередования, но не учитываете слово data.

Вместо этого можно использовать re.match , чтобы начать сопоставление с начала строки, и использовать data\d+$ для сопоставления данных, за которыми следуют 1+ цифр до конца строки:

import re
strings_of_text = ['data0', 'data23', 'data2', 'data55', 'data_mismatch', 'green']
strings_to_keep = []
expression_to_use = r'data\d+$'

for string in strings_of_text:
    # If the string is data#
    if (re.match(expression_to_use, string)):
        strings_to_keep.append(string)

print(strings_to_keep)

Python demo

Вы можете продолжать работать с отфильтрованной коллекцией вместо создания новой, используя, например, фильтр:

import re
strings_of_text = ['data0', 'data23', 'data2', 'data55', 'data_mismatch', 'green']
strings_to_keep = []
expression_to_use = r'data\d+$'

strings_of_text = list(filter(lambda x: re.match(expression_to_use, x), strings_of_text))
print(strings_of_text)

Результат

['data0', 'data23', 'data2', 'data55']

Демо Python

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

Вы должны использовать re.compile, если вы используете тот же шаблон, так как он имеет меньше накладных расходов.

strings_of_text = ['data0', 'data23', 'data2', 'data55', 'data_mismatch', 'green']

import re
engine = re.compile(r'data\d+$')
strings_to_keep = [s for s in strings_of_text if engine.match(s)]
print(strings_to_keep) # ['data0', 'data23', 'data2', 'data55']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...