1

在非字母字符处使用正则表达式很容易分割文本:

tokens=re.split(r'(?u)\W+',text) #to split at any non-alpha unicode character

这个答案提供了一种在某些字符处拆分的方法。但是,我需要的是:

  1. 在任何 unicode 非 alpha 处拆分
  2. 给正则表达式以下例外:

    • 下划线“_”
    • 这个斜线“/”
    • 和号“&”和符号“@”
    • 由数字包围的句号 \d+
    • 以某些任意字符串“先生”、“博士”...等开头的句号

我可以使用正则表达式轻松检测到其中的任何一个,但问题是如何告诉正则表达式将它们作为非 alpha 拆分的例外。


编辑:这是我要匹配的示例文本:

text="Mr. Jones email jones@gmail.com 12.455 12,254.25 says This is@a&test example_cool man+right more/fun 43.35. And so we stopped. And then we started again. وبعدها رجعنا إلى المنزل، وقابلنا أصدقاءنا؛ وشربنا الشاي."

这是它的 unicode 版本(注意阿拉伯语中的非字母字符 u'\u060c', u'\u061b')

unicode_text=u'Mr. Jones email jones@gmail.com 12.455 12,254.25 says This is@a&test example_cool man+right more/fun 43.35. And so we stopped. And then we started again. \u0648\u0628\u0639\u062f\u0647\u0627 \u0631\u062c\u0639\u0646\u0627 \u0625\u0644\u0649 \u0627\u0644\u0645\u0646\u0632\u0644\u060c \u0648\u0642\u0627\u0628\u0644\u0646\u0627 \u0623\u0635\u062f\u0642\u0627\u0621\u0646\u0627\u061b \u0648\u0634\u0631\u0628\u0646\u0627 \u0627\u0644\u0634\u0627\u064a.'

这是提供的答案中正则表达式的结果:

re.split(r'(?u)(?![\+&\/@\d+\.\d+Mr\.])\W+',unicode_text)

[u'Mr.', u'Jones', u'email', u'jones@gmail.com', u'12.455', u'12', u'254.25', u'says', u'This' , u'is@a&test', u'example_cool', u'man+right', u'more/fun', u'43.35.', u'And', u'so', u'we', u' ', u'And', u'then', u'we', u'started', u'again.', u'\u0648\u0628\u0639\u062f\u0647\u0627', u'\u0631 \u062c\u0639\u0646\u0627', u'\u0625\u0644\u0649', u'\u0627\u0644\u0645\u0646\u0632\u0644', u'\u0648\u0642\u0627\u0628\u0644\u06 \u0627', u'\u0623\u0635\u062f\u0642\u0627\u0621\u0646\u0627', u'\u0648\u0634\u0631\u0628\u0646\u0627', u'\u0627\u0647\u0634\u206 \u064a.']

请注意,正则表达式没有在单词结尾处围绕句号进行拆分。所以如果能有一些东西来处理这个就好了

4

2 回答 2

0

关键是使用负前瞻。我认为这涵盖了您列表中的所有示例,但如果我遗漏了什么,请告诉我。

In [549]: re.split(r'(?u)(?![\+&\/@\d+\.\d+Mr\.])\W+', "Mr.Jones says This is@a&test example_cool man+right more/fun 43.35")
Out[549]: ['Mr.Jones', 'says', 'This', 'is@a&test', 'example_cool', 'man+right', 'more/fun', '43.35']

(?!) 中组内的任何内容都不会匹配。让我知道我是否正确理解了这个问题。

于 2013-10-18T22:03:20.240 回答
0

jones@gmail.com我认为您不想像in那样拆分电子邮件地址jones@gmailcom因此我将您的例外要求由数字包围的句号更改为句号后跟一个字母数字字符

re.split(r'(?u)(?![_/&@.])\W+|(?<!Mr|Dr)\.(?!\w)\W*', unicode_text)

[u'Mr.', u'Jones', u'email', u'jones@gmail.com', u'12.455', u'12', u'254.25', u'says', u'This' , u'is@a&test', u'example_cool', u'man', u'right', u'more/fun', u'43.35', u'And', u'so', u'we', u'stopped', u'And', u'then', u'we', u'started', u'again', u'\u0648\u0628\u0639\u062f\u0647\u0627', u'\u0631 \u062c\u0639\u0646\u0627', u'\u0625\u0644\u0649', u'\u0627\u0644\u0645\u0646\u0632\u0644', u'\u0648\u0642\u0627\u0628\u0644\u06 \u0627', u'\u0623\u0635\u062f\u0642\u0627\u0621\u0646\u0627', u'\u0648\u0634\u0631\u0628\u0646\u0627', u'\u0627\u0647\u0634\u206 \u064a', u'']

于 2014-09-30T09:24:03.457 回答