python正则表达式拆分任意\W+;除了一些例外

python正则表达式拆分任意\W+;除了一些例外,python,regex,string,unicode,split,Python,Regex,String,Unicode,Split,在非字母字符处使用正则表达式可以轻松拆分文本: tokens=re.split(r'(?u)\W+',text) #to split at any non-alpha unicode character 并提供了在某些字符处拆分的方法。然而,我需要的是: 在任意unicode非alpha位置拆分 为regex提供以下例外情况: 下划线为“33;” 此斜杠“/” 符号“&”和符号“@” 由数字包围的句号\d+ 以某些任意字符串“Mr.”、“Dr.”等开头的句号 我可以使用regex轻松地检测

在非字母字符处使用正则表达式可以轻松拆分文本:

tokens=re.split(r'(?u)\W+',text) #to split at any non-alpha unicode character
并提供了在某些字符处拆分的方法。然而,我需要的是:

  • 在任意unicode非alpha位置拆分
  • 为regex提供以下例外情况:

    • 下划线为“33;”
    • 此斜杠“/”
    • 符号“&”和符号“@”
    • 由数字包围的句号\d+
    • 以某些任意字符串“Mr.”、“Dr.”等开头的句号
  • 我可以使用regex轻松地检测到其中任何一个,但问题是如何告诉regex将它们作为非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'中的非字母字符)

    以下是所提供答案中正则表达式的结果:

    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&“测试”,例如“酷”, 你的“男人+权利”,你的“更多/乐趣”,你的“43.35”,你的“和”,你的“所以”,你的“我们”, 你“停了”,你“然后”,你“我们”,你“开始”,你又一次, 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\u0646\u0627', u'\u0623\u0635\u062f\u0642\u0627\u0621\u0646\u0627', u'\u0648\u0634\u0631\u0628\u0646\u0627', u'\u0627\u0644\u0634\u0627\u064a']


    请注意,正则表达式并没有在单词的末尾拆分句号。因此,最好能有办法解决这个问题,关键是使用消极的前瞻。我想这涵盖了你清单上的所有例子,但是如果我遗漏了什么,请告诉我

    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']
    

    (!)中组内的任何内容都将不匹配。如果我理解正确,请告诉我。

    我认为您不希望像
    jones@gmail.com
    in
    jones@gmail
    com
    ,因此我将由数字包围的异常要求句号更改为后跟字母数字字符的句号


    re.split(r'(?u)(?![/&.]))\W+|(?是的,这就是我想要的,所以你尝试过什么?除了最后的部分,这非常简单。请注意
    \W
    匹配字母数字字符和下划线
    \u
    !因此
    \W
    正好相反。我尝试过:tokens=re.split('(?u)[^\W]/]|(?我不确定你所说的“比较”是什么意思……我希望正则表达式围绕任何非字母字符分割,除非这个字符是[,],并且当你说“它不工作”时,它被一些东西包围着。”请具体说明。它与什么匹配?是否匹配?脚本是否因错误而失败?谢谢,但它没有按预期工作,请参阅上面的编辑。我从您那里得到的是,您提供的问题的答案有效,但现在您希望它与阿拉伯文匹配?外语中的非字母字符应由re库处理.如果非阿尔法的标准定义与您的不匹配,只需扩展我解释的方法。
    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']
    
    re.split(r'(?u)(?![_/&@.])\W+|(?<!Mr|Dr)\.(?!\w)\W*', unicode_text)