2016-03-09 3 views
3

Как-то озадачен тем, как регулярные выражения работают в python, я ищу заменить все запятые внутри строк, которым предшествует буква, и следует либо буквой, либо пробелом. Например:Регулярные выражения: заменить запятую на строку, Python

2015,1674,240/09,PEOPLE V. MICHAEL JORDAN,15,15 
2015,2135,602832/09,DOYLE V ICON, LLC,15,15 

Первая строка имеет 6 столбцов, а вторая - 7 столбцов. Таким образом, я пытаюсь заменить запятую (N, L) во второй строке пробелом (NL), а так:

2015,2135,602832/09,DOYLE V ICON LLC,15,15 

Это то, что я пытался до сих пор, без успеха однако:

new_text = re.sub(r'([\w],[\s\w|\w])', "", text) 

Любые идеи, в которых я ошибаюсь?

Помощь была бы очень признательна!

ответ

5

Узор вы используете, ([\w],[\s\w|\w]), является потребляя слово символ (= алфавитно-цифровой или подчеркивания, [\w]) перед ,, затем сопоставляет запятой, а затем сопоставляются (и снова, потребляет) 1 символ - это пробел, символ слова или литерал | (как внутри класса символа, символ трубы считается символом литерала, а не переменным).

Итак, главная проблема заключается в том, что \w соответствует буквам и цифрам.

Вы можете фактически использовать lookarounds:

(?<=[a-zA-Z]),(?=[a-zA-Z\s]) 

Смотрите regex demo

(?<=[a-zA-Z]) является положительным просмотром назад, что требует письма, чтобы быть непосредственно перед , и (?=[a-zA-Z\s]) является положительным опережением, который требует письма или пробелы, которые должны присутствовать сразу после запятой.

Вот Python demo:

import re 
p = re.compile(r'(?<=[a-zA-Z]),(?=[a-zA-Z\s])') 
test_str = "2015,1674,240/09,PEOPLE V. MICHAEL JORDAN,15,15\n2015,2135,602832/09,DOYLE V ICON, LLC,15,15" 
result = p.sub("", test_str) 
print(result) 

Если вы все еще хотите использовать \w, вы можете исключить цифры и подчеркивания из него, используя противоположный класс \W внутри инверсный класса символов:

(?<=[^\W\d_]),(?=[^\W\d_]|\s) 

См. another regex demo

+0

Спасибо, что нашли время, чтобы описать свой подход тщательно! То, как я это понимаю, [a-zA-Z] совпадающие буквы и [a-zA-Z \ s] буквы или пробелы. Но почему бы вам не использовать | выразить или заявить? Во-вторых, в чем разница между «? <=» И «? ="? Разве оно соответствует любой букве (одному или ни одному символу) и букве/пробелу (ровно одному символу)? – chizze

+0

1) Я не использую символ символа '|' внутри [** character class **] (http://www.regular-expressions.info/charclass.html), потому что это необязательно, отношение чередования по умолчанию внутри положительного символьного класса (то есть '[123]' соответствует либо '1', либо' 2', либо '3'). 2) '(? <= ...)' и '(? = ...)' являются [** lookarounds **] (http://www.regular-expressions.info/lookaround.html), пожалуйста прочитайте страницу по ссылке - они используются для проверки наличия какого-либо шаблона, и если он отсутствует, совпадения не происходит. –

+0

Большое спасибо за разъяснение! Я использовал выражение регулярного выражения, и он отлично работает. – chizze

0

\w соответствует a-z, A-Z и 0-9, поэтому ваше регулярное выражение заменит все запятые. Вы можете попробовать следующее регулярное выражение и заменить на \1\2.

([a-zA-Z]),(\s|[a-zA-Z]) 

Here is the DEMO.

+0

Спасибо! Я заработал. – chizze

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