python正则表达式标记化自定义字符作为拆分点

python正则表达式标记化自定义字符作为拆分点,python,regex,tokenize,Python,Regex,Tokenize,我想标记一个句子(纯粹使用regex,而不必安装NLTK或类似的工具)。我希望标记器: 用连字符“-”和撇号“”-->分开,例如(我没有听到好消息::我没有听到好消息) 如果后面只跟一个空格-->例如(我有,大约16000.13美元(a)可供使用::我有,大约16000.13美元(a)可供使用) 我创建了这个函数,但它仍然没有围绕“(”)拆分: Python的一个奇怪之处:re.split不会在零宽度匹配上分割 大多数正则表达式引擎允许您在零宽度匹配上拆分,即字符串中的某个位置。例如,您可以

我想标记一个句子(纯粹使用regex,而不必安装NLTK或类似的工具)。我希望标记器:

  • 用连字符“-”和撇号“”-->分开,例如(我没有听到好消息::我没有听到好消息)
  • 如果后面只跟一个空格-->例如(我有,大约16000.13美元(a)可供使用::我有,大约16000.13美元(a)可供使用)
我创建了这个函数,但它仍然没有围绕“(”)拆分:


Python的一个奇怪之处:re.split不会在零宽度匹配上分割


大多数正则表达式引擎允许您在零宽度匹配上拆分,即字符串中的某个位置。例如,您可以使用lookback
(?也显示预期输出。前两个规则不描述
我这样做了,在每个点的示例中,您是否可以将所需的输出放在python列表中,以便更清晰?因此您只想拆分基于撇号或连字符?它不会围绕“(”拆分,因为它后面没有空格,但在您的示例中后跟“a”。您必须为此创建一个额外的规则。
def tok(txt): #we want to make sure that only apostrophs and hyphens are splitting points, and all other non alpha characters not followed by space to be non-spliting points
    sub=re.sub(r'(?u)(\W)(?!\S)',r' \1 ',txt)
    sub=re.sub(r"(?u)([\-\'\[\(\{])",r' \1 ',sub) #will need to add more exceptions
    return [v for v in re.split('(?u)\s+',sub) if v]
re.split("(?=&)", "a&fine&tree")
regex.split("(?V1)(?=&)", "a&fine&tree")
result = re.findall("[-'()]|[^a-z0-9 ](?= )|(?:[a-z0-9]|[^-'()a-z0-9 ](?! ))+", subject, re.IGNORECASE)
I
haven
'
t
heard
good
-
news
I
have
,
some
16,000.13
dollars
(
A
)
to
spare