2014-11-11 3 views
3

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

т.е.

Большая, быстрая ошибка ели медленнее один.

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

'The fast, big bug...' 

То, что я до сих пор:

Я имею в виду, она включает в себя a findall для запятой и пробелом, а затем какая-то обратная функция.

+1

Я думаю, вы имеете в виду a * regular * выражение. –

+0

@ScottHunter Я сожалею, просто вернулся к редактированию – movietime

ответ

2

Вы должны re.sub() для этого, как:

>>> a="The big, fast bug ate the slower one. The quick, brown fox jumps over the lazy dog" 
>>> re.sub(r'\s(\w*),\s+(\w*)\s',r' \2, \1 ',a) 
'The fast, big bug ate the slower one. The brown, quick fox jumps over the lazy dog' 

это только заменяет слова, разделенные «,» теми же словами в обратном порядке, оставляя остальную часть строки такой, какой она есть.

2
(\w+)(\s*),(\s*)(\w+) 

Try this.Replace по \4\2,\3\1 .Увидь демо.

http://regex101.com/r/tF5fT5/32

import re 
p = re.compile(ur'(\w+)(\s*),(\s*)(\w+)', re.IGNORECASE) 
test_str = u"The big, fast bug ate the slower one." 
subst = ur"\4\2,\3\1" 

result = re.sub(p, subst, test_str) 
+0

vks: в Python это не $ 4 $ 2, $ 3 $ 1, а вместо этого \ 4 \ 2, \ 3 \ 1. – twasbrillig

+0

Еще одна вещь, она должна быть «subst = ur» \ 4 \ 2, \ 3 \ 1 "'. Он должен быть rawstring. – twasbrillig

1

импорта повторно

re.sub ('(\ W +) \ S *, \ S * (\ W +)', '\\ 2 \\ 1',)

re.sub ('(\ W +) \ S * \ S * (\ W +)', '\\ 2 \\ 1', 'быстрый, большой ошибкой')

'Большой, быстрый ошибка'

\ S * соответствует нулю или больше пространства

\ ш + соответствует слову. \ Ш в основном [A-Za-z0-9_]

назад ссылка \ 1 (экранированы, как \\ 1) заменяет первый матч подстроки и так далее

Мы пытаемся соответствовать только слова с обеих сторон запятой и переключатель совпавших подстрок

https://docs.python.org/2/library/re.html

Смежные вопросы