繁体   English   中英

Python正则表达式拆分但将正则表达式匹配的结尾部分放回字符串中?

[英]Python regex split but put end part of regex match back into string?

我想找到一个正则表达式,可以将段落(长字符串,无需换行符)分解成句子,其简单规则是{。,?,!}中的a,后跟空白,然后是大写字母应该是句子的结尾(我意识到这不是现实生活中的好规则)。

我有部分工作,但并不能完全完成工作:

line = 'a b c FFF! D a b a a FFF. gegtat FFF. A'
matchObj = re.split(r'(.*?\sFFF[\.|\?|\!])\s[A-Z]', line)
print (matchObj)

版画

['', 'a b c FFF!', '', ' a b a a FFF. gegtat FFF.', '']

而我想得到:

['a b c FFF!', 'D a b a a FFF. gegtat FFF.']

有两个问题。

  • 为何会出现空成员( '' )的结果吗?

  • 我知道D为何会从拆分结果中删除-这是第一次搜索的一部分。 如何以不同的方式组织搜索,以便将标点符号后的大写字母放回原处,以便可以将其包含在下一个句子中? 在这种情况下,如何使D在分割结果的第二个元素中出现?

我知道我可以通过某种for循环来完成此任务,只需剥离第一个结果,加回大写字母,然后再重新进行一次,但这似乎不太像Pythonic。 如果正则表达式不是解决问题的办法,那么还有什么可以避免for循环的吗?

感谢您的任何建议。

  1. 要解决第一个问题split()返回的结果中的空字符串),请使用findall()finditer()

     >>> re.findall(r'(.*?\\sFFF[\\.|\\?|\\!])\\s[AZ]', line) ['abc FFF!', ' abaa FFF. gegtat FFF.'] 

    您在输出中看到空字符串,因为这是split()应该做的事情:使用匹配的组作为定界符分割输入字符串。

  2. 对于第二个问题 (输出中缺少D ),请使用先行断言 (?=...)

     >>> re.findall(r'(.*?\\sFFF[\\.|\\?|\\!])\\s(?=[AZ])', line) ['abc FFF!', 'D abaa FFF. gegtat FFF.'] 

    前瞻,否定前瞻,后向和否定后备是四种断言,您可以用来说“仅在组后面/前面有此组,但不使用该字符串才匹配该组”。

  3. 仔细阅读表达式,似乎您误解了[...]运算符的语法。 看来您想搭配之一. ? !

    如果是这种情况,则可以[\\.|\\?|\\!]重写为[.?!]

     >>> re.findall(r'(.*?\\sFFF[.?!])\\s(?=[AZ])', line) ['abc FFF!', 'D abaa FFF. gegtat FFF.'] 

    [.?!]不仅更紧凑,而且更正确:使用[\\.|\\?|\\!]您还可以匹配| 字符(这样'abc FFF|'是有效的匹配项)!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM