1

我正在尝试匹配所有包含引号的句子,而与引号的长度或引号中的句子数量无关。

正如 Alfe 指出的那样,获得完美的正则表达式可能不可行,但如果可能的话,我想改进我正在使用的正则表达式。

现在我这样做是为了找到报价:

def split_by_quotes(text):
    pattern = r'([A-Z].*?\".*?\".*?\.)'
    quotes = re.findall(pattern, text)
    return(quotes)

但我想确保引用出现在一个句子中,然后捕获整个句子。

我所说的一句话是指一段文字:

  1. 通常前面有一个空格
  2. 以大写字符或引号开头
  3. 以 a 结尾。或者 !或者 ?或(有时直接跟在“或”之后)
  4. 通常后跟一个空格

正如 Alfe 指出的那样,这不会捕获所有句子,但如果我能在这些条件下匹配就足够了。

例如:

“这是一个报价,应该匹配”

这是多个回车后换行没有引号的文本,不应匹配。

更复杂的例子:

查尔斯·巴贝奇说:“有两次,[国会议员]问我,‘请祈祷,巴贝奇先生,如果你把错误的数字输入机器,正确的答案会出来吗?’ 我无法正确理解会引发这样一个问题的那种混乱的想法。”

整个句子会匹配。

但,

他们称 Garfield Minus Garfield 和 Lolcats,但当约翰逊看到一段他认为特别搞笑的片段时,有人摔倒,然后被一只带键盘的猫“弹下台”,他的朋友们认为这是蹩脚的。“我说,这会很大。”他说,“我的朋友们说,‘不,这只是一只猫。’”

将匹配如下:

他们称 Garfield Minus Garfield 和 Lolcats,但当约翰逊看到一段他认为特别搞笑的片段时,有人摔倒,然后被一只带键盘的猫“弹下台”,他的朋友们认为这是蹩脚的。

“我说,这会很大。”他说,“我的朋友们说,‘不,这只是一只猫。’”

4

3 回答 3

1

我认为你想做的事情不能使用正则表达式来完成。

自然语言是一个复杂的东西,即使是书面语言也没有看起来那么容易。我想指出几件事,以明确哪些特殊情况是我得出结论的基础:

他降落了——砰!- 在地上。


“停止!” 他喊道。


500万人死亡。

我不知道这些示例如何与自然语言句子的纯正则表达式匹配。

编辑:

计算机几乎不可能区分这两种情况:

之后,他说:“再也不会了!” 然后他离开了房间。


他敲了敲桌子,“再也不来了!” 彼得说完,就离开了房间。

在字符级别上,两者看起来完全相同(引号后的大写字母等),但第一个应解析为两个句子,第二个应解析为一个。需要像人类一样理解智能才能看到这两种情况是不同的。技术字符不显示这一点。

于 2013-11-14T15:09:50.743 回答
1

这对你有帮助吗?

请注意,我编辑了我的第一个答案是愚蠢的,因为其中的正则表达式匹配所有句子,而不是带有引号的句子。
我还考虑了 Alve 的评论:正则表达式捕获的句子不仅以大写字母开头,而且仅以点后的第一个字符开头,除了空白或\rn或可能的附加点

import re
regx = re.compile('(?!\Z)'
                  '[. \n\r]*'
                  '('
                    '(?:[^."]*"[^"]*")+'
                    '[^."]*'
                    '(?:\.|\Z)'
                  ')')

s = ('''\nThe "some.rutu"  and "oula oulah, poto."  are '''
     '''all good. A "bi'didi."  is not.  I '''
     """don't know why... 5 "million" people """
     """died . \nAnd here's a sentence without """
     """a quote. "Halt!" he shouted. 'Sunny """
     """days and "nights"'  is a strange phrase""")
print s
print
for el in regx.findall(s):
    print '- %s' % el

结果

The "some.rutu"  and "oula oulah, poto."  are all good. A "bi'didi."  is not.  I don't know why... 5 "million" people died . 
And here's a sentence without a quote. "Halt!" he shouted. 'Sunny days and "nights"'  is a strange phrase

- The "some.rutu"  and "oula oulah, poto."  are all good.
- A "bi'didi."  is not.
- 5 "million" people died .
- "Halt!" he shouted.
- 'Sunny days and "nights"'  is a strange phrase
于 2013-11-14T15:50:24.933 回答
0

这种模式在红宝石中对我有用。一旦你将它转换为 r'' 在 python 中应该没问题

/([a-zA-Z,\' ]+\"[^.]+\.)/

艾略特

于 2013-11-14T14:14:28.250 回答