我正尝试使用正则表达式在标点符号上分割文本,仅当标点符号在单词后面并在空格或字符串末尾使用时。
我尝试过([a-zA-Z])([,;.-])(\s|$)
但是当我想在Python中拆分时,它包括单词的最后一个字符。
我想这样分割它:
text = 'Mr.Smith is a professor at Harvard, and is a great guy.'
splits = ['Mr.Smith', 'is', 'a', 'professor', 'at', 'Harvard', ',', 'and', 'a', 'great', 'guy', '.']
任何帮助将不胜感激!
答案 0 :(得分:2)
似乎您想进行标记化。尝试nltk
http://text-processing.com/demo/tokenize/
from nltk.tokenize import TreebankWordTokenizer
splits = TreebankWordTokenizer().tokenize(text)
答案 1 :(得分:2)
您可以使用
re.findall(r'\w+(?:\.\w+)*|[^\w\s]', s)
请参见regex demo。
详细信息
\w+(?:\.\w+)*
-1个以上的字符字符,后跟0个或更多的点,再加上1个以上的字符字符,|
-或[^\w\s]
-除单词和空格字符外的任何字符。import re
rx = r"\w+(?:\.\w+)*|[^\w\s]"
s = "Mr.Smith is a professor at Harvard, and is a great guy."
print(re.findall(rx, s))
输出:['Mr.Smith', 'is', 'a', 'professor', 'at', 'Harvard', ',', 'and', 'is', 'a', 'great', 'guy', '.']
。
此方法可以进一步精确化。例如。仅将字母,数字和下划线标记为标点符号:
re.findall(r'[+-]?\d*\.?\d+|[^\W\d_]+(?:\.[^\W\d_]+)*|[^\w\s]|_', s)
请参见regex demo
答案 2 :(得分:1)
您可以先在([.,](?=\s)|\s)
上分割,然后过滤掉空字符串或空白字符串:
In [16]: filter(lambda s: not re.match(r'\s*$', s) , re.split(r'([.,](?=\s)|\s)', 'Mr.Smith is a professor at Har
...: vard, and is a great guy.'))
Out[16]:
['Mr.Smith',
'is',
'a',
'professor',
'at',
'Harvard',
',',
'and',
'is',
'a',
'great',
'guy.']