【问题标题】:Regex / Regular Expression Python 2.7正则表达式/正则表达式 Python 2.7
【发布时间】:2014-03-23 10:37:48
【问题描述】:

我正在尝试了解正则表达式以及如何使用它将包含段落的字符串拆分为句子。

编辑:如果我有文字:

Hello, my name is Mr. Bob. I am 15.2 months old. Can you believe that? No... Oh well.

我想让它变成

Hello, my name is Mr. Bob.
I am 15.2 months old.
Can you believe that?
No... Oh well.

【问题讨论】:

  • 您的问题是什么?我没有看到,请具体说明。
  • 那么有哪些标题呢? Mr. Mrs. Ms., Dr. Md. M.D., PA。 ... 什么标点符号应该结束一个句子?看起来像一个兔子洞,而且绝对不是为正则表达式量身定制的。
  • 我不想使用 NLTK,但经过一些研究,我相信它更适合这项任务。标点符号如? !或句号。头衔列表不用太深,常见的 Mr. Mrs. Dr. Miss. Ms.

标签: python regex string python-2.7


【解决方案1】:

所以你需要一个.? 后跟一个或多个空格:[.?]\s+。此外,您不想拆分多个点。为此,我会使用负面回顾:

(?<!\.)[.?]\s+

然后是标题的问题。您也可以将它们包含在负面回顾中。需要注意的是,负回溯组必须始终匹配相同数量的字符,因此我们只需使用普通的 . 在需要的情况下“填充”回溯:

print re.sub(r'(?<!..\.|.Mr|Mrs|.Ms)[.?]\s+', '\\g<0>\n', s)
   Hello, my name is Mr. Bob.
   I am 15.2 months old.
   Can you believe that?
  'No... Oh well.

注意我们如何使用. 将我们的回溯填充到 3 个字符。 \. 变成 ..\.Mr 变成 .Mr 等等。我们需要 3 个字符,因为这是我们最长回溯的长度:Mrs。在替换中,\\g&lt;0&gt; 被扩展为替换匹配的整个字符串,不包括回溯。

从这里开始,应该可以直接扩展正则表达式以满足您的需求。最后一点是,在运行正则表达式之前,我会从段落中删除所有换行符。这可能不是完全必要的,但似乎很谨慎,因为. 默认情况下不匹配换行符。

【讨论】:

  • 感谢您的回复!是否可以将下一个放在下一行而不是插入逗号?此外,“例如 this”语句在不应该分裂时也会分裂。
  • 我将字符串拆分为 Python 列表。将列表转换为换行符分隔的字符串很容易,例如参见this page
  • 非常感谢克里斯的帮助,如果不是太麻烦,你能解释一下你在标题上使用的回顾吗?我无法在我的文本文件上实现它。它总是在新行上返回标题
  • 查看 Python regex documentation(?&lt;!ABC) 如果字符串中的当前位置之前没有匹配 ABC 则匹配。如果您还有其他问题,请提出具体问题,包括示例。
猜你喜欢
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 2010-09-12
  • 2011-08-06
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多