Найти подстроку, которая появляется перед словом в строке до числа - PullRequest
0 голосов
/ 11 июля 2019

У меня есть строка:

"abc mysql 23 rufos kanso engineer"

Я хочу, чтобы регулярное выражение выводило строку перед словом «инженер», пока оно не увидит число.

То есть регулярное выражение должно выводить:

23 rufos kanso

Другой пример:

Строка:

def grusol defno 1635 minos kalopo, ruso engineer okas puno"

Я хочу, чтобы регулярное выражение выводило строку перед словом «инженер», пока оно не увидит число.

То есть регулярное выражение должно выводить:

1635 minos kalopo, ruso

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

Могу ли я сделать это одним выстрелом?

Спасибо

Ответы [ 3 ]

0 голосов
/ 11 июля 2019

Используйте positive look-ahead, чтобы соответствовать, пока слово «инженер» не предшествует цифре.

The regex - (?=\d)(.+)(?=engineer)

Просточтобы получить представление:

import re
pattern = r"(?=\d)(.+)(?=engineer)"
input = [ "\"def grusol defno 1635 minos kalopo, ruso engineer okas puno\"", "\"abc mysql 23 rufos kanso engineer\"" ]

matches = []

for item in input:
    matches.append(re.findall(pattern, item))

Вывод:

[['1635 minos kalopo, ruso '], ['23 rufos kanso ']]
0 голосов
/ 11 июля 2019

Взгляните на этот сайт . Замечательно играть с регулярным выражением, и оно объясняет каждый шаг.
Вот решение вашей проблемы: ссылка

0 голосов
/ 11 июля 2019

Шаблон, который я бы использовал: ((\d+)(?!.*\d).*)engineer - он ищет последнюю цифру и идет оттуда.

Нечто подобное (\d.*)engineer также будет работать, но только если в строке будет только одна цифра.


>>> import re
>>> string = '123 abc mysql 23 rufos kanso engineer'
>>> pattern = r'((\d+)(?!.*\d).*)engineer'
>>> re.search(pattern, string).group(1)
'23 rufos kanso '
>>>

Редактировать

Если после части 'Engineer' есть цифры, шаблон, упомянутый выше, не работает, как вы указали в комментарии,Я пытался решить ее, но, честно говоря, я не смог придумать новый шаблон (извините).

Обходной путь, который я мог бы предложить, это предположить, что «инженер» по-прежнему является «ключевым» словом, разбивая вашу исходную строку по указанному слову.

Вот иллюстрация того, что я имею в виду:

>>> string = '123 abc mysql 23 rufos kanso engineer 1234 b65 de'
>>> string.split('engineer')
['123 abc mysql 23 rufos kanso ', ' 1234 b65 de']
>>> string.split('engineer')[0] 
'123 abc mysql 23 rufos kanso '

# hence, there would be no unexpected digits

>>> s = string.split('engineer')[0]
>>> pattern = r'((\d+)(?!.*\d).*)'
>>> re.search(pattern, s).group(1)
'23 rufos kanso '
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...