我想找到一个正则表达式,它可以将段落(长字符串,没有新行字符需要担心)分解成句子,其中一个简单的规则是{.,?,!}后跟一个空格然后是一个大写字母应该是句子的结尾(我意识到这对现实生活来说不是一个好规则).
我有部分工作,但它没有完成这项工作:
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)
Run Code Online (Sandbox Code Playgroud)
版画
['', 'a b c FFF!', '', ' a b a a FFF. gegtat FFF.', '']
Run Code Online (Sandbox Code Playgroud)
而我想得到:
['a b c FFF!', 'D a b a a FFF. gegtat FFF.']
Run Code Online (Sandbox Code Playgroud)
所以有两个问题.
为什么结果中有空成员('')?
我理解为什么D从分裂结果中删除 - 这是第一次搜索的一部分.如何以不同的方式构建我的搜索,以便在标点符号后面的大写字母被放回,以便它可以包含在下一句中?在这种情况下,如何让D在分割结果的第二个元素中出现?
我知道我可以通过某种for循环来完成这个,只是剥离第一个结果,加回大写字母,然后重新做一遍,但这似乎不是那么Pythonic.如果正则表达式不是这里的方法,还有什么东西仍然可以避免for循环吗?
谢谢你的任何建议.
要解决第一个问题(返回的结果中的空字符串split()),请使用findall()或finditer():
>>> re.findall(r'(.*?\sFFF[\.|\?|\!])\s[A-Z]', line)
['a b c FFF!', ' a b a a FFF. gegtat FFF.']
Run Code Online (Sandbox Code Playgroud)
您在输出中看到空字符串,因为这split()是应该做的:使用匹配的组作为分隔符拆分输入字符串.
对于第二个问题(输出中缺少的D),使用前瞻断言 (?=...):
>>> re.findall(r'(.*?\sFFF[\.|\?|\!])\s(?=[A-Z])', line)
['a b c FFF!', 'D a b a a FFF. gegtat FFF.']
Run Code Online (Sandbox Code Playgroud)
前瞻,负向前瞻,外观和负面外观是四种断言,你可以用它们来说"只有在跟随/先于组时才匹配这个组,但不要使用字符串".
仔细阅读你的表达,似乎你误解了[...]运算符的语法.看起来你想要匹配其中一个.,?和!.
如果是这种情况,那么您可以重写[\.|\?|\!]为[.?!]:
>>> re.findall(r'(.*?\sFFF[.?!])\s(?=[A-Z])', line)
['a b c FFF!', 'D a b a a FFF. gegtat FFF.']
Run Code Online (Sandbox Code Playgroud)
[.?!]不仅更紧凑,而且更正确:[\.|\?|\!]你也匹配|角色(这'a b c FFF|'是一个有效的匹配)!
| 归档时间: |
|
| 查看次数: |
184 次 |
| 最近记录: |