Соответствие нескольких слов условно - PullRequest
0 голосов
/ 23 сентября 2019

У меня большой текстовый файл, состоящий из строк, аналогичных приведенным ниже:

timestamp = foo bar baz
timestamp = foo bar
timestamp = foo

Я пытался написать регулярное выражение, совпадающее с foo, но если присутствуют и bar, и baz, это соответствуетте же.

r"= (.*) (.*)? (.*)?"

, но он соответствует только строке foo bar baz, а не двум другим.Как я могу заставить регулярное выражение соответствовать опциям?

Ответы [ 3 ]

1 голос
/ 23 сентября 2019

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

(\w+\s*=\s*)|(\w+)

Тест

import re


regex = r"(\w+\s*=\s*)|(\w+)"
string = """
timestamp = foo bar baz foo bar baz
timestamp = foo bar baz
timestamp = foo bar
timestamp = foo
"""

for groups in re.findall(regex, string):
    if groups[0] == '':
        print(groups[1])
    else:
        print("--- next timestamp ----")

Вывод

--- next timestamp ----
foo
bar
baz
foo
bar
baz
--- next timestamp ----
foo
bar
baz
--- next timestamp ----
foo
bar
--- next timestamp ----
foo

Если вы хотите упростить / изменить / изучить выражение, это было объяснено на верхней правой панели regex101.com .Если хотите, вы также можете посмотреть в эту ссылку , как она будет сопоставляться с некоторыми примерами ввода.


1 голос
/ 23 сентября 2019

Может быть, что-то вроде этого будет достаточно?

 (?<=\=\s)(\S+)\s?(\S+)? ?(\S+)?

Regex Demo

Объяснение:

 (?<=\=\s)       # Positive lookbehind - capture = + space but don't match
 (\S+)           # Capture any non-whitespace character
 \s?             # Capture optional space
 (\S+)?          # Capture any non-whitespace character
  ?              # Capture optional space
 (\S+)?          # Capture any non-whitespace character
0 голосов
/ 23 сентября 2019

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

r'= *(\S+)(?: *(\S+))?(?: *(\S+))?'

или для сопоставления с любыми горизонтальными пробелами:

r'=[^\S\r\n]*(\S+)(?:[^\S\r\n]*(\S+))?(?:[^\S\r\n]*(\S+))?'

См. Демонстрационную версию regex

Подробности

  • =[^\S\r\n]* - символ = и любые 0 или более символов, кроме LF, CR и непробельных символов (т. Е. Все пробельные символы, кроме перевода строки и переносавозвращает), или просто пробелы, если вы используете *
  • (\S+) - Группа 1: любые 1+ непробельные символы
  • (?:[^\S\r\n]*(\S+))? - необязательная группа без захвата, которая соответствует1 или 0 вхождений
    • [^\S\r\n]* - 0+ горизонтальных пробелов
    • (\S+) - Группа 2: любые 1+ непробельных символов
  • (?:[^\S\r\n]*(\S+))? - необязательная группа без захвата, которая соответствует 1 или 0 вхождениям
    • [^\S\r\n]* - 0+ горизонтальных пробелов
    • (\S+) - Группа 3: любые 1+ не-пробельные символы

Python demo :

import re
s = "timestamp = foo bar baz\ntimestamp = foo bar\ntimestamp = foo"
print( re.findall(r'= *(\S+)(?: *(\S+))?(?: *(\S+))?', s) )
# => [('foo', 'bar', 'baz'), ('foo', 'bar', ''), ('foo', '', '')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...