正则表达式匹配所有句子与引号

时间:2013-11-14 13:43:41

标签: python regex

我试图匹配所有包含引号的句子,与引号的长度或引号内的句子数无关。

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

现在我这样做是为了找到引用:

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

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

我用句子来表示一段文字:

  1. 通常以空格开头
  2. 以大写字母或引号
  3. 开头
  4. 以a结尾。要么 !要么 ?或(有时直接跟着“或”)
  5. 通常后跟空格
  6. 这不会像Alfe指出的那样捕获所有句子,但如果我能在这些条件下匹配就足够了。

    例如:

      

    “这是一个引用,它应该匹配”

         

    这是多次回车后在新行上没有引号的文本,不应匹配。

    更复杂的例子:

      查尔斯巴贝奇说:“有两次,我被[议会议员]问过,'祈祷,巴贝奇先生,如果你把错误的数字投入机器,那么正确的答案会出来吗?'我无法正确地理解可能引发这样一个问题的那种想法混淆。“

    整个句子都匹配。

    但是,

      

    他们打电话给Garfield Minus Garfield和Lolcats,但是当约翰逊看到他认为是一个特别搞笑的片段,有人摔倒然后被一个带键盘的猫“戏剧”时,他的朋友认为这是蹩脚的。 “我说,这会很大。”他说,“我的朋友就像,'不,这只是一只猫。'”

    将匹配如下:

      

    他们打电话给Garfield Minus Garfield和Lolcats,但是当约翰逊看到他认为是一个特别搞笑的片段,有人摔倒然后被一个带键盘的猫“戏剧”时,他的朋友认为这是蹩脚的。

      

    “我说,这会很大。”他说,“我的朋友就像,'不,这只是一只猫。'”

3 个答案:

答案 0 :(得分:1)

我认为使用正则表达式无法完成您想要做的事情。

自然语言是一件复杂的事情,即使是书面文字并不像看起来那么容易。有几件事我想指出,以明确哪些特殊情况可以为我的结论奠定基础:

  他降落了 - 砰的一声! - 在地上。


  

“暂停”!他喊道。


  

500万人死亡。

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

编辑:

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

  

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


  他打在桌子上,“再也不会!”彼得说,离开了房间。

在字符级别上,两者看起来完全相同(引号后的大写等),但第一个应该被解析为两个句子,第二个被解析为一个。要理解两种情况都不同,这取决于人类的理解情报。技术字符不显示此内容。

答案 1 :(得分:1)

这对你有帮助吗?

请注意,我编辑了第一个愚蠢的答案,因为其中的regx与所有句子匹配,而不是带引号的句子。
我也考虑到了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

答案 2 :(得分:0)

这种模式对我来说是红宝石。将它转换为r''

后,在python中应该没问题

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

埃利奥特