2015-06-10 4 views
0

Я пытаюсь разбить строку на python с помощью регулярных выражений. Эта линия работает почти идеально для меня:Python regex splitting дополнительно на _

from string import punctuation 
import re 
row = re.findall('\w+|[{0}]+'.format(punctuation), string) 

Однако он не разбивает строку на экземпляры _. Например:

>>> string = "Hi my name is _Mark. I like apples!! Do you?!" 
>>> row = re.findall('\w+|[{0}]+'.format(punctuation), string) 
>>> row 
['Hi', 'my', 'name', 'is', '_Mark', '.', 'I', 'like', 'apples', '!!', 'Do', 'you', '?!'] 

Что я хочу:

['Hi', 'my', 'name', 'is', '_', 'Mark', '.', 'I', 'like', 'apples', '!!', 'Do', 'you', '?!'] 

Я прочитал его, потому что _ считается характер. Кто-нибудь знает, как это сделать? Спасибо за помощь.

+0

're.findall ('\ ш + | [{0}] + | _ +'. (Формат пунктуации), строка) ' –

+0

^Вышеупомянутая проблема дает мне такую ​​же проблему: _Mark – mt88

ответ

3

Поскольку \w будет соответствовать подчеркивание, вы можете более непосредственно указать, что вы считаете характер не слишком много больше работы:

re.findall('[a-zA-Z0-9]+|[{0}]+'.format(punctuation), string) 
+0

Это отлично работает. Благодаря! – mt88

0

Так как левая сторона дизъюнкции всегда будет соответствовать первой, если это возможно, вы можете просто включить _ с символами пунктуации перед тем вы подходите буквы:

row = re.findall(r'[{0}_]+|\w+'.format(string.punctuation), mystring) 

Но вы можете сделать то же самое, не утруждая string.punctuation. «Пунктуация» - это все, что не является ни пространством, ни символом слова:

row = re.findall(r"(?:[^\s\w]|_)+|\w+", mystring) 

PS. В вашем примере кода строка с именем string «затеняет» модуль string. Не делайте этого, это плохая практика и приводит к ошибкам.

0

ясно сказано в Python docs, что \w включают не только буквенно-цифровые символы, но и подчеркивание, а также:

\ ш

Когда локаль и UNICODE флаги не указаны, соответствует любому буквенно-цифровой символ и символ подчеркивания; это эквивалентно набору [a-zA-Z0-9_]. С помощью LOCALE он будет соответствовать набору [0-9_] плюс любые символы, определенные как буквенно-цифровые для текущего локального . Если установлен UNICODE, это будет соответствовать символам [0-9_] плюс , что классифицируется как буквенно-цифровое в символе Unicode .

так как Эрик отметил в своем решении, лучше указать набор только алфавитно-цифровых символов [a-zA-Z0-9]