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

Python 使用正则表达式拆分字符串,python,regex,python-3.x,tokenize,Python,Regex,Python 3.x,Tokenize,我的任务是使用正则表达式对语料库中的单词进行标记,但我在标记缩写词(如“e.g.”或“I.e.”)时遇到了困难。特别是,我正在查看的语料库中出现的一个出现在'(注意--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(spl

我的任务是使用正则表达式对语料库中的单词进行标记,但我在标记缩写词(如“e.g.”或“I.e.”)时遇到了困难。特别是,我正在查看的语料库中出现的一个出现在
'(注意--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']

['(','N.B.,'B.,'-I']
我相信我可以用|-+

但是,我不明白为什么这个B.会重复

分割包括所有捕获组。使用
(?:…)
围绕
\w子模式创建一个非捕获组。
取而代之:

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

接下来,如果要在重复的破折号上拆分,只需使用
|
添加一个替代模式:

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


这会在这两者之间产生一个空字符串,因为在
N.B.
拆分点和
--
点之间有0个字符;您必须再次过滤掉这些字符。

OP说:['(','N.B.,'-','I']是理想的吗output@RomanPerekhrest:当然,但他们主要问我不明白为什么这个B.会重复。@RomanPerekhrest:他们没有指定任何令牌规则来详细说明如何从
--
中拆分
-
。这只是问题的一部分。如何生成所需的输出?@RomanPerekhrest:我们无法回答这个问题没有澄清的部分;我已经对这个问题进行了评论。
--
I
应该按照什么规则分割?你的分割模式只涉及重复的单词字符后跟一个
点。我们是否应该认为
--I
分割超出了这个问题的范围?
split_p = r'((?:\w\.){2,}|-+)'
>>> split_p = r'((?:\w\.){2,}|-+)'
>>> re.split(split_p, string)
['(', 'N.B.', '', '--', 'I']