регулярное выражение Python: строка с максимальным пробелом - PullRequest
0 голосов
/ 21 мая 2019

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

s = "a    b d d  c"
pattern = "(?P<a>.*) +(?P<b>.*) +(?P<c>.*)"
print(re.match(pattern, s).groupdict())

возвращается:

{'a': 'a    b d d', 'b': '', 'c': 'c'}

Я хотел бы иметь:

{'a': 'a', 'b': 'b d d', 'c': 'c'}

Ответы [ 5 ]

3 голосов
/ 21 мая 2019

С помощью Четвертого ответа птицы Мне удалось сделать это так, как я себе это представлял:

import re
s = "a    b d d  c"
pattern = "(?P<a>\S(?: \S)*) +(?P<b>\S(?: \S)*) +(?P<c>\S(?: \S)*)"
print(re.match(pattern, s).groupdict())
3 голосов
/ 21 мая 2019

Другой вариант может заключаться в том, чтобы использовать zip и dict и генерировать символы на основе длины совпадений.

Вы можете получить совпадения, содержащие не более одного пробела, используя повторяющийся шаблон, совпадающий с пробелом.char \S и повторять 0+ раз через пробел, за которым следует непробельный символ:

\S(?: \S)*

Regex demo | Python demo

Например:

import re
a=97
regex = r"\S(?: \S)*"
test_str = "a    b d d  c"
matches = re.findall(regex, test_str)
chars = list(map(chr, range(a, a+len(matches))))
print(dict(zip(chars, matches)))

Результат

{'a': 'a', 'b': 'b d d', 'c': 'c'}
2 голосов
/ 21 мая 2019

Я нашел другое решение, которое мне даже больше нравится:

import re
s = "a    b dll d  c"
pattern = "(?P<a>(\S*[\t]?)*) +(?P<b>(\S*[\t ]?)*) +(?P<c>(\S*[\t ]?)*)"
print(re.match(pattern, s).groupdict())

здесь даже можно иметь более одной буквы.

2 голосов
/ 21 мая 2019

Возможно, проще использовать re.split, поскольку разделитель известен (2 или более пробелов), а промежуточные шаблоны - нет.Я уверен, что кто-то, кто лучше в regex, чем я, может поработать над прогнозом, но, разбив \s{2,}, вы можете значительно упростить проблему.

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

import re
s = "a    b d d  c"

x = dict(zip('abc', re.split('\s{2,}', s)))

x
{'a': 'a', 'b': 'b d d', 'c': 'c'}

Где первый аргумент в zip - это именованные группы.Чтобы распространить это на более общие имена:

groups = ['group_1', 'another group', 'third_group']
x = dict(zip(groups, re.split('\s{2,}', s)))

{'group_1': 'a', 'another group': 'b d d', 'third_group': 'c'}
2 голосов
/ 21 мая 2019

Похоже, вы просто хотите разделить строку на 2 или более пробелов.Вы можете сделать это следующим образом:

s = "a    b d d  c"
re.split(r' {2,}', s)

вернет вам:

['a', 'b d d', 'c']

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