Python 查找并拆分单词后面的某些字符

Python 查找并拆分单词后面的某些字符,python,regex,Python,Regex,我尝试使用正则表达式来拆分标点符号上的文本,只有当标点符号跟在单词后面并在空格或字符串末尾进行时 我试过([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', ',',

我尝试使用正则表达式来拆分标点符号上的文本,只有当标点符号跟在单词后面并在空格或字符串末尾进行时

我试过
([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', '.']

任何帮助都将不胜感激

您似乎想进行标记化。尝试
nltk


看起来你想做标记化。尝试
nltk

你可以用

re.findall(r'\w+(?:\.\w+)*|[^\w\s]', s)

详细信息

  • \w+(?:\。\w+)*
    -1+字字符后跟0个或多个点,后跟1+字字符
  • |
    -或
  • [^\w\s]
    -除单词和空格字符以外的任何字符
:

输出:
['Mr.Smith'、'is'、'a'、'professor'、'at'、'Harvard'、'、'和'、'is'、'a'、'great'、'guy'、'.]

这种方法可以进一步精确。例如,仅将字母、数字和下划线标记为标点符号:

re.findall(r'[+-]?\d*\.?\d+|[^\W\d_]+(?:\.[^\W\d_]+)*|[^\w\s]|_', s)
请参阅您可以使用的

re.findall(r'\w+(?:\.\w+)*|[^\w\s]', s)

详细信息

  • \w+(?:\。\w+)*
    -1+字字符后跟0个或多个点,后跟1+字字符
  • |
    -或
  • [^\w\s]
    -除单词和空格字符以外的任何字符
:

输出:
['Mr.Smith'、'is'、'a'、'professor'、'at'、'Harvard'、'、'和'、'is'、'a'、'great'、'guy'、'.]

这种方法可以进一步精确。例如,仅将字母、数字和下划线标记为标点符号:

re.findall(r'[+-]?\d*\.?\d+|[^\W\d_]+(?:\.[^\W\d_]+)*|[^\w\s]|_', s)

请参阅您可以首先在
([,](?=\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.']

您可以先在
([,](?=\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.']

实际上,您也希望在空格上拆分。使用NLTK、Spacy等尝试
re.findall(r'\w+(?:\.\w+)*.[^\w\s]',s)
。您仍然需要使用正则表达式来覆盖某些情况。如果你想采用NLP的方式,你也应该检查一下。你实际上还想在空格上拆分。使用NLTK、Spacy等尝试
re.findall(r'\w+(?:\.\w+)*.[^\w\s]',s)
。您仍然需要使用正则表达式来覆盖某些情况。如果你想走NLP的路,你也应该检查一下。