我正在使用re.findall
这样:
x=re.findall('\w+', text)
所以我得到一个与字符[a-zA-Z0-9]
匹配的单词列表。
问题是当我使用这个输入时:
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~:
我想得到一个空列表,但我得到['','']。怎么可能 我排除那些下划线?
答案 0 :(得分:3)
使用 [a-zA-Z0-9]
模式; \w
包含下划线:
x = re.findall('[a-zA-Z0-9]+', text)
或在添加了\w
的否定字符集中使用\W
,_
的倒数:
x = re.findall('[^\W_]+', text)
后者具有即使使用re.UNICODE
或re.LOCALE
也能正常工作的优势,其中\w
匹配更广泛的字符。
演示:
>>> import re
>>> text = '!"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~!"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~:'
>>> re.findall('[^\W_]+', text)
[]
>>> re.findall('[^\W_]+', 'The foo bar baz! And the eggs, ham and spam?')
['The', 'foo', 'bar', 'baz', 'And', 'the', 'eggs', 'ham', 'and', 'spam']
答案 1 :(得分:0)
您也可以使用groupby
from itertools import groupby
x = [''.join(g) for k, g in groupby(text, str.isalnum) if k]
例如
>>> text = 'The foo bar baz! And the eggs, ham and spam?'
>>> x = [''.join(g) for k, g in groupby(text, str.isalnum) if k]
>>> x
['The', 'foo', 'bar', 'baz', 'And', 'the', 'eggs', 'ham', 'and', 'spam']