Регулярное выражение: сопоставление списка слов с пробелами, за исключением последнего пробела - PullRequest
1 голос
/ 23 апреля 2010

Как мне сопоставить разделенный пробелами список слов, за которым следуют пробел и некоторые необязательные числа? У меня есть это:

>>> import re
>>> m = re.match('(?P<words>(\S+\s+)+)(?P<num>\d+)?\r\n', 'Foo Bar  12345\r\n')
>>> m.groupdict()
{'num': '12345', 'words': 'Foo Bar  '}

Я бы хотел, чтобы группа слов не включала последние пробелы, но я не могу понять это. Я мог бы сделать .strip () на результат, но это не так весело :))


Некоторые строки для проверки и требуемый результат:

'Foo & Bar 555\r\n' => {'num': '555', 'words': 'Foo & Bar'}

'Hello World\r\n' => {'num': None, 'words': 'Hello World'}

'Spam     99\r\n' => {'num': 99, 'words': 'Spam'}

'Number 1 666\r\n' => {'num': 666, 'words': 'Number 1'}

1 Ответ

2 голосов
/ 23 апреля 2010

Меня немного смущает ваша группа двойной захвата и тот факт, что вы используете \w, но хотите сопоставить не состоящий из слов символ, такой как & (может быть, вы имеете в виду \S, без пробелов) , где вы говорите \w ...?), но, может быть ...:

>>> import re
>>> r = re.compile(r'(?P<words>\w+(?:\s+\S+)*?)\s*(?P<num>\d+)?\r\n')
>>> for s in ('Foo & Bar 555\r\n', 'Hello World\r\n', 'Spam     99\r\n',
...           'Number 1 666\r\n'):
...   print s, r.match(s).groupdict()
... 
Foo & Bar 555
{'num': '555', 'words': 'Foo & Bar'}
Hello World
{'num': None, 'words': 'Hello World'}
Spam     99
{'num': '99', 'words': 'Spam'}
Number 1 666
{'num': '666', 'words': 'Number 1'}
>>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...