python - 与正则表达式匹配的句子

标签 python regex python-2.7 text-segmentation

我有一个分成多行的文本,没有特定的格式。所以我决定为每一行 line.strip('\n')。然后我想使用句子结束标记 将文本拆分成句子。 考虑:

  1. 句点 . 后跟 \s(空格)、\S(如 " ') 后跟 [A-Z] 会拆分
  2. 不要拆分[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 Samam I am 。那真的是你想要的吗?如果不是,请使用零宽度断言来排除您想要匹配但也保留的部分。以下是您的选择,按照我认为您最可能想要的顺序排列。

1) 保留下一句的句号和首字母或开头引号;丢失空格:

(?<=\.)\s+(?=[A-Z"\'])

这会将上面的示例拆分为 I am Sam.Sam I am.

2) 保留下一句的第一个字母;去掉句号和空格:

\.\s+(?=[A-Z"\'])

这将分成 I am SamSam 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/

相关文章:

python - 为 Dataframe 的特定列添加前缀

python - Django 管理员可以处理数百万条记录吗?

javascript - 用 RegEx 替换罗马数字 I-XXX

python - 检查 key 是否在字典中?

python - 带有 python 列表和拆分的 IndexError 消息

python - 如何在 Debug模式下将命令行参数从 VS 传递给 Python?

python - GUI 在单独的进程中触发操作

python - python时间对象有问题

Python正则表达式不匹配完整捕获组

javascript - 非常棘手的 html 字符作为文本