Regex Поиск с запятыми - PullRequest
       5

Regex Поиск с запятыми

0 голосов
/ 27 апреля 2020

нужна помощь в отношении выражения регулярных выражений.

str = 'label1 a1,832,b2 and label2 2, c45'

при попытке вернуть результаты как

['label a1',label 832','label b2','label 2', 'label c45']

, пока я могу получить только ['label2 a1','label2 2']

спасибо!

изменить:

для уточнения.

У меня есть список меток

labelList = ['dog','cat','mouse',...]

str = 'There are 3 locations which are dog 122, h25 and cat a3.'

Результат должен быть:

result = 'dog 122', 'dog h25' and 'cat a3'.

В настоящее время я делаю поиск по регулярному выражению следующим образом:

for x in labelList:
    re.search(r'\b(%s) ([^ \r\n]+\b')

Надеюсь, это прояснит вопрос!

edit2:

labelList = ['dog','cat','mouse',...]

str = 'There are 3 locations which are dog 122, h25 and cat a3.'

for x in labelList:

    if re.search(r'\b(%s)\b' % (x), str):

        nr = [f"(%s) {m}" % (x) for m in re.findall(r"(?:(%s))?(\w+)",  comText) if m!= 'and']
        print(nr)

Однако , вывод кажется неправильным. Это дает мне следующий вывод

["(dog) (' ','there')", "(dog) (' ','are')", "(dog) (' ', '3')" ... 

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

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

import re
str = 'label1 a1,832,b2 and label2 2, c45'
str = str.replace('and', ',')
str = re.sub(r"label[0-9]+", "", str)
labels = ['label {}'.format(x.strip()) for x in str.split(',')]

Вывод:

labels = ['label a1', 'label 832', 'label b2', 'label 2', 'label c45']

На мой взгляд, label[0-9]+ и подстрока and бесполезны Информация. Просто удалите его и извлеките названия ярлыков. Затем восстановите строки, используя string.format() function

0 голосов
/ 27 апреля 2020

Хорошо. Пока у меня есть способ извлечь текст, следующий за одной из меток, либо до точки, либо за словом «и».

>>> target_str = 'There are 3 locations which are dog 122, h25 and cat a3.'
>>> label_list = ['dog', 'cat', 'mouse', 'wombat']
>>> 
>>> expr = r"\b(" + '|'.join(label_list) + r")(.*?)(?:and|\.)"
>>>
>>> label_expr = re.compile(expr)  # Put somwhere it will only be compiled once.
>>>
>>> new_label_list = [f"{species} {tag}" 
...                   for species, tags in label_expr.findall(target_str)
...                   for tag in re.findall(r"\w+", tags)]
>>> new_label_list
['dog 122', 'dog h25', 'cat a3']
>>> 

Метки извлекаются в два этапа. Сначала мы получаем список кортежей, где первый элемент - это вид (собака, кошка), а второй - необработанный список тегов (или ярлыков). Затем выполняется итерация для создания окончательных меток.

Если вы компилируете выражение, поместите код компиляции куда-нибудь, где его нужно выполнить только один раз - иначе какой смысл его компилировать.

Или используя .finditer() вместо .findall().

>>> new_label_list = [f"{m.group(1)} {tag}"
...                   for m in label_expr.finditer(target_str)
...                   for tag in re.findall(r"\w+", m.group(2))]
>>> new_label_list
['dog 122', 'dog h25', 'cat a3']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...