我有一个分成多行的文本,没有特定的格式。所以我决定为每一行 line.strip('\n')
。然后我想使用句子结束标记 将文本拆分成句子。
考虑:
- 句点
.
后跟\s
(空格)、\S
(如"
'
) 后跟[A-Z]
会拆分 - 不要拆分
[0-9]\.[A-Za-z]
,如1.stackoverflow实时解决方案
。
我的程序只求解 1 的一半 - 句点 (.) 后跟\s 和 [A-Z]。下面是代码:
# -*- coding: utf-8 -*-
import re, sys
source = open(sys.argv[1], 'rb')
dest = open(sys.argv[2], 'wb')
sent = []
for line in source:
line1 = line.strip('\n')
k = re.sub(r'\.\s+([A-Z“])'.decode('utf8'), '.\n\g<1>', line1)
sent.append(k)
for line in sent:
dest.write(''.join(line))
请问!我想知道掌握正则表达式的最佳方法是什么。好像有点乱。
最佳答案
要在字符类中包含单引号,请使用 \ 将其转义。正则表达式应该是:
\.\s+[A-Z"\']
这就是您真正需要的。你只需要告诉正则表达式匹配什么,你不需要指定你不想匹配的东西。不符合模式的一切都不会匹配。
此正则表达式将匹配任何后跟空格和大写字母或引号的句点。由于紧接数字和紧接字母的句点不符合这些条件,因此不会匹配。
正如您所说,这是假设您拥有的正则表达式正在努力拆分一个句点,然后是空格,然后是大写字母。但是请注意,这意味着 I am Sam. Sam I am.
将拆分为 I am Sam
和 am I am
。那真的是你想要的吗?如果不是,请使用零宽度断言来排除您想要匹配但也保留的部分。以下是您的选择,按照我认为您最可能想要的顺序排列。
1) 保留下一句的句号和首字母或开头引号;丢失空格:
(?<=\.)\s+(?=[A-Z"\'])
这会将上面的示例拆分为 I am Sam.
和 Sam I am.
2) 保留下一句的第一个字母;去掉句号和空格:
\.\s+(?=[A-Z"\'])
这将分成 I am Sam
和 Sam I am
。这假设后面还有更多的句子,否则句点将留在第二句,因为它后面没有空格和大写字母或引号。如果此选项是您想要的 - 没有句点的句子,那么您可能还想匹配一个句点后跟字符串的结尾,中间有可选的空格,这样最后的句点和任何尾随空格都将被删除:
\.(?:\s+(?=[A-Z"\'])|\s*$)
注意 ?:
。您需要非捕捉括号,因为如果您在拆分中有捕获组,则该组捕获的任何内容均以结果中的元素添加(例如split('(+)', 'a+b+c'
.
3) 保留一切;空格与前面的句子一起出现:
a
这会给你 +
b
和 +
关于你问题的最后一部分,我见过的正则表达式语法的最佳资源是 http://www.regular-expressions.info 。从此摘要开始:http://www.regular-expressions.info/reference.html 然后转到教程页面以获取更高级的详细信息:http://www.regular-expressions.info/tutorial.html
关于python - 与正则表达式匹配的句子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18048230/