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

2024-07-03 08:22:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我想找到一个正则表达式,它可以将段落(长字符串,无需担心换行符)分解成句子,使用的规则是:an of{?, !}句子的结尾应该是一个空格,然后是一个大写字母(我知道这对现实生活来说不是一个好规则)。在

我有一些东西在部分工作,但它不能完全起作用:

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)

印刷品

^{pr2}$

我想得到:

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

有两个问题。在

  • 为什么结果中有空成员('')?

  • 我理解为什么D会从分割结果中去掉-它是第一次搜索的一部分。我怎样才能使我的搜索结构有所不同,这样标点符号后面的大写字母就会被放回去,这样它就可以包含在下一个句子中呢?在这种情况下,如何让D出现在分割结果的第二个元素中?

我知道我可以用某种for循环来完成,只需去掉第一个结果,再加上大写字母,然后再重复一遍,但这似乎不那么像Python。如果regex不是这里的方法,那么还有什么东西可以避免for循环吗?在

谢谢你的建议。在


Tags: of字符串anforfff规则结尾line
1条回答
网友
1楼 · 发布于 2024-07-03 08:22:51
  1. 要解决第一个问题(由split()返回的结果中的空字符串),使用^{}^{}

    >>> re.findall(r'(.*?\sFFF[\.|\?|\!])\s[A-Z]', line)
    ['a b c FFF!', ' a b a a FFF. gegtat FFF.']
    

    您在输出中看到空字符串,因为split()应该这样做:使用匹配的组作为分隔符拆分输入字符串。

  2. 对于第二个问题(输出中缺少的D),使用lookahead assertion(?=...)

    ^{pr2}$

    Lookaheads、negative Lookaheads、lookbehinds和negative lookebhinds是四种断言,可以用来表示“只有在group后面/前面加上group时才匹配此组,但不使用字符串”。

  3. 仔细阅读您的表达式,您似乎误解了[...]运算符的语法。似乎要匹配.?和{}中的一个。在

    如果是这样,那么可以将[\.|\?|\!]重写为[.?!]

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

    [.?!]不仅更紧凑,而且更正确:使用[\.|\?|\!]还匹配了|字符(因此'a b c FFF|'是一个有效的匹配)!

相关问题 更多 >