我试图使用re.finditer获取字符串中一个单词的开始和停止索引号。在大多数情况下,我的模式工作得很好,但对于一个具有特殊字符的词,我的准则给了我一个错误。
问题:
我试过:
a = " we have c++ and c#"
pattern = ['c#','c++']
regex = re.compile(r'\b(' + '|'.join(pattern) + r')\b')
out = [ (m.start(0), m.end(0)) for m in regex.finditer(a)]当前产出:
error: multiple repeat at position x预期产出:
[(9,12),(17,19)]对于大多数情况下,我的模式工作良好,但字有特殊的特点,我有一个问题。我对regex不太熟悉,请大家帮帮忙,谢谢!
发布于 2020-06-15 18:37:18
代码:
a = " we have c++ and c#"
pattern = [ r'\b{}(?=\s|$)'.format(re.escape(s)) for s in ['c#','c++']]
regex = re.compile('|'.join(pattern))
[ (m.start(0), m.end(0)) for m in regex.finditer(a)]详细信息:
第一个问题是,特殊字符;您可以手动转义特殊字符。
'c\\+\\+', 'c\\#\\#']或者,为了简化您可以使用re.escape,它可以为您完成这一任务。
re.escape('c++, c##')第二个问题是,单词边界;对于特殊字符,它们的行为方式与字母数字字符的行为不同,例如\bfoo\b。
引用python文档
B型字界
匹配空字符串,但仅在单词的开头或结尾匹配。单词定义为字母数字或下划线字符的序列,因此单词的结尾由空格或非字母数字、非下划线字符表示。注意,在形式上,\b被定义为a \w和a \W字符之间的边界(反之亦然),或者\w与字符串的开头/结尾之间的边界,因此被认为是字母数字的精确字符集取决于UNICODE和LOCALE标志的值。例如,r'\bfoo\b‘匹配' foo’、'foo.‘、'(foo)’、'bar foo baz‘而不是'foobar’或‘foo 3’。
要使此工作,您可以使用积极的前瞻性断言。
r'\b{}(?=\s|$)'
它查找模式后面的空白(\s)字符或句子的末尾($)。
https://stackoverflow.com/questions/62394002
复制相似问题