使用正则表达式拆分字符串

时间:2017-04-16 19:56:18

标签: python regex python-3.x tokenize

我的任务是使用正则表达式对语料库中的单词进行标记,但是我无法将缩写标记为“例如”或“即”。特别是,我正在查看的语料库中出现的那个显示为'(N.B.--I'

string = '(N.B.--I'
pattern = r'(\w\.){2,}'
split_p = r'((\w\.){2,})'

match = re.search(pattern, string)
print(match)

split = re.split(split_p, string)
print(split)

['(', 'N.B.', '--', 'I']是所需的输出列表,但是当我运行它时...

<_sre.SRE_Match object; span=(1, 5), match='N.B.'>
['(', 'N.B.', 'B.', '--I']

我相信我可以用| - +

分割破折号

然而,我无法理解为什么这个B.正在重复

1 个答案:

答案 0 :(得分:0)

拆分包括所有捕获组。使用(?:...)创建围绕\w.子模式的非捕获组:

split_p = r'((?:\w\.){2,})'

演示:

>>> import re
>>> split_p = r'((?:\w\.){2,})'
>>> string = '(N.B.--I'
>>> re.split(split_p, string)
['(', 'N.B.', '--I']

接下来,如果您想要重复破折号,只需添加|的替代模式:

split_p = r'((?:\w\.){2,}|-+)'

演示:

>>> split_p = r'((?:\w\.){2,}|-+)'
>>> re.split(split_p, string)
['(', 'N.B.', '', '--', 'I']

这会在中间产生一个空字符串,因为N.B.分割点和--点之间有0个字符;你必须再次过滤掉它们。