与正则表达式匹配的句子

2024-04-16 10:38:18 发布

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

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

  1. 句点.后面跟一个\s(空白),\S(比如"'),后面跟着[A-Z]
  2. 不要拆分[0-9]\.[A-Za-z],就像1.stackoverflow real time solution。在

我的程序只解后面跟a\s和[a-Z]的1-句点(.)的一半。代码如下:

# -*- 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))

拜托!我想知道掌握正则表达式的最好方法是什么。这似乎令人困惑。在


Tags: in文本resourceforsyslineopen
1条回答
网友
1楼 · 发布于 2024-04-16 10:38:18

要在character类中包含单引号,请使用\对其进行转义。正则表达式应该是:

\.\s+[A-Z"\']

这就是你所需要的。你只需要告诉正则表达式匹配什么,你不需要指定你不想匹配的。所有不符合模式的东西都不匹配。在

此正则表达式将匹配后跟空格的任何句点,后跟大写字母或引号。因为紧跟数字后面紧跟字母的句点不符合这些标准,所以它将不匹配。在

这是假设您所使用的regex是在分割一个句点,然后是空白,然后是大写,如您所述。但是请注意,这意味着I am Sam. Sam I am.将分裂为I am Sam和{}。这真的是你想要的吗?否则,请使用零宽度断言来排除要匹配但也要保留的部分。以下是你的选择,按照我认为你最有可能想要的顺序排列。在

1)保留句点和下一句话的第一个字母或左引号;去掉空格:

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

这将把上面的例子分成I am Sam.和{}

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

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

这将分为I am Sam和{}。这假设后面还有更多的句子,否则句点将保留在第二个句子中,因为后面没有空格和大写字母或引号。如果这个选项是您想要的-句子没有句点,那么您可能还需要匹配一个句点后跟字符串的结尾,并使用可选的中间空格,这样最后的句点和任何尾随的空白都将被删除:

\.(?:\s+(?=[A-Z"\'])|\s*$)

注意?:。您需要非捕获括号,因为如果在拆分中有捕获组,则该组捕获的任何内容都将作为元素添加到结果中(例如,split('(+)', 'a+b+c'给您一个a+b+c,而不仅仅是abc)。在

3)保留所有内容;空格与前一句:

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

这将给您I am Sam.和{}

关于您问题的最后一部分,我看到的有关regex语法的最佳资源是http://www.regular-expressions.info。从以下摘要开始:http://www.regular-expressions.info/reference.html然后转到教程页面以获取更高级的详细信息:http://www.regular-expressions.info/tutorial.html

相关问题 更多 >