Регулярное выражение для соответствия слов и концевых пробельных пар - PullRequest
1 голос
/ 09 ноября 2011

У меня есть текст:

"    Alice, Bob    Charlie  "

, и я хотел бы получить пары слов (если есть) и пробел после него.То есть:

[("", "    "), ("Alice,", " "), ("Bob", "    "), ("Charlie", "  ")]`

В Python я попытался:

re.findall(r"(\S*)(\s*)", "    Alice, Bob    Charlie  ")

, который почти работает - он просто добавляет пустую пару ("", "") в конце.Как от этого избавиться?За исключением .pop ()?Кроме того, я не совсем понимаю, почему он вообще существует - после того, как он соответствует пробелу Чарли, он должен закончить, нет?

Правка: чтобы уточнить - я хочу первую пару, то есть без слова с пробелом.Последний - без слов, без пробелов - это тот, от которого я хочу избавиться.Без .pop (), возможно ...

Ответы [ 3 ]

2 голосов
/ 09 ноября 2011

Попробуйте изменить \s* на \s+, чтобы указать как минимум 1 символ пробела:

>>> re.findall(r"(\S*)(\s+)", "    Alice, Bob    Charlie  ")
[('', '    '), ('Alice,', ' '), ('Bob', '    '), ('Charlie', '  ')]
2 голосов
/ 09 ноября 2011

Я думаю, что это сделало бы

re.findall('(\S+|^)(\s*)', s)
2 голосов
/ 09 ноября 2011
re.findall(r"(\S+)(\s*)", "    Alice, Bob    Charlie  ")

со знаком + после \S возвращает то, что вы, вероятно, хотите:

[('Alice,', ' '), ('Bob', '    '), ('Charlie', '  ')]

в противном случае \S*\s* может совпадать с пустой строкой в ​​конце: ноль или больше и ноль или больше могут также равняться длине нуля.

Другая возможность (кроме .pop()) будет:

[a for a in re.findall(r"(\S*)(\s*)", "    Alice, Bob    Charlie  ") if a != ('','')]

или

re.findall(r"(\S*)(\s*)", "    Alice, Bob    Charlie  ")[:-1]

оба возвращают именно то, что вам нужно (включая пробел в начале):

[('', '    '), ('Alice,', ' '), ('Bob', '    '), ('Charlie', '  ')]
...