我正在尝试使用正则表达式在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', '?!']
我读过它因为_被认为是一个角色。有谁知道如何做到这一点?谢谢你的帮助。
答案 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]