Python正则表达式另外拆分_

时间:2015-06-10 20:58:54

标签: python regex

我正在尝试使用正则表达式在python中拆分字符串。这条线对我来说几乎完美无缺:

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', '?!']

我读过它因为_被认为是一个角色。有谁知道如何做到这一点?谢谢你的帮助。

3 个答案:

答案 0 :(得分:3)

由于\w将与下划线匹配,因此您可以更直接地指定您认为角色的内容而无需更多工作:

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

答案 1 :(得分:0)

因为如果可能的话,分离的左侧将始终首先匹配,您可以在匹配字母之前简单地包含带有标点字符_

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

但是你可以做同样的事情,而不必费心去打string.punctuation。 “标点符号”既不是空格也不是单词字符:

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

PS。在您的代码示例中,名为string的字符串“遮蔽”模块string。不要这样做,这是不好的做法,并导致错误。

答案 2 :(得分:0)

Python docs明确指出\w不仅包括字母数字字符,还包括下划线:

  

\ W

     

如果未指定LOCALE和UNICODE标志,则匹配any   字母数字字符和下划线;这相当于   设置[a-zA-Z0-9_]。使用LOCALE,它将匹配设置[0-9_]加上   任何字符都被定义为当前的字母数字   语言环境。如果设置了UNICODE,则将匹配字符[0-9_] plus   在Unicode字符中被分类为字母数字的任何内容   属性数据库。

就像埃里克在他的解决方案中指出的那样,更好地指定一组只有字母数字的字符[a-zA-Z0-9]