Как написать регулярное выражение для следующего сценария? - PullRequest
0 голосов
/ 06 мая 2019

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

без использования ^ like

[^ i|like|to|drink][\w+](\s*)(\w*)

Regex:?

Пример 1:

sentence = i like to drink black tea
output = black tea

Пример 2:

sentence: drink tea
output : tea

Пример 3:

sentence = drink pomegranate juice
output = pomegranate juice

Ответы [ 3 ]

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

Ваш шаблон [^ i|like|to|drink][\w+](\s*)(\w*) использует класс отрицательных символов , который будет соответствовать любому символу, который не входит в класс символов.

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

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

\bdrink\b\s+(.*)$

Regex demo

Если есть возможностьперед несколькими словами, которые вы хотите сопоставить, вы можете использовать чередование:

\b(?:drink|have)\b\s+(.*)$

Regex demo

Другой вариант - разделить слово "пить"между границами слова \b

import re
strings = ["i like to drink black tea", "drink tea", "drink pomegranate juice", "testdrinktest"]
for str in strings:
    parts = re.split(r"\bdrink\b", str)
    if len(parts) > 1:
        print(parts[1])

Результат:

 black tea
 tea
 pomegranate juice
0 голосов
/ 08 мая 2019

Это выражение может помочь вам сделать это, просто создав две группы захвата:

(drink)\s(.+)

enter image description here

График

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

enter image description here

Код

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"(drink)\s(.+)"

test_str = ("i like to drink black tea\n"
    "drink tea\n"
    "drink pomegranate juice\n")

matches = re.finditer(regex, test_str, re.MULTILINE)

for matchNum, match in enumerate(matches, start=1):

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

Выход

Match 1 was found at 10-25: drink black tea
Group 1 found at 10-15: drink
Group 2 found at 16-25: black tea
Match 2 was found at 26-35: drink tea
Group 1 found at 26-31: drink
Group 2 found at 32-35: tea
Match 3 was found at 36-59: drink pomegranate juice
Group 1 found at 36-41: drink
Group 2 found at 42-59: pomegranate juice
0 голосов
/ 06 мая 2019

Попробуйте шаблон (?<=\bdrink\b)\s*(.*$) -> Lookbehind

Ex:

import re

data = ["i like to drink black tea", "drink tea", "drink pomegranate juice"]
for sentence in data:
    m = re.search(r"(?<=\bdrink\b)\s*(.*$)", sentence)
    if m:
        print(m.group(1))

Выход:

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