gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:51:29 28 4
gpt4 key购买 nike

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

我有一些东西可以部分工作,但还不能完全完成工作:

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[A-Z]', line)
    ['a b c FFF!', ' a b a a FFF. gegtat FFF.']

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

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

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

    先行、负先行、后行和负后行是四种断言,您可以使用它们来表示“仅当后跟/前有组时才匹配该组,但不使用字符串”。

    <
  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|' 是有效匹配项)!

关于Python正则表达式拆分但将正则表达式匹配的结尾部分放回字符串中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30084912/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com