Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式匹配所有带引号的句子_Python_Regex - Fatal编程技术网

Python 正则表达式匹配所有带引号的句子

Python 正则表达式匹配所有带引号的句子,python,regex,Python,Regex,我试图匹配所有包含引号的句子,与引号的长度或引号内的句子数量无关 正如阿尔夫指出的,获得一个完美的正则表达式可能是不可行的,但如果可能的话,我想改进我正在使用的正则表达式 现在我这样做是为了找到报价: def split_by_quotes(text): pattern = r'([A-Z].*?\".*?\".*?\.)' quotes = re.findall(pattern, text) return(quotes) 但我想确保引用出现在一个句子中,然后捕获整个句

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

正如阿尔夫指出的,获得一个完美的正则表达式可能是不可行的,但如果可能的话,我想改进我正在使用的正则表达式

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

def split_by_quotes(text):
    pattern = r'([A-Z].*?\".*?\".*?\.)'
    quotes = re.findall(pattern, text)
    return(quotes)
但我想确保引用出现在一个句子中,然后捕获整个句子

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

  • 通常前面有空格
  • 以大写字符或引号开头
  • 以一个或多个字母结尾。或或或(有时直接后跟“或”)
  • 后面通常跟一个空格
  • 正如阿尔夫指出的那样,这并不能涵盖所有的句子,但如果我能满足这些条件,那就足够了

    例如:

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

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

    更复杂的例子:

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

    整句话都很相配

    但是,

    他们称加菲猫为加菲猫减去加菲猫和萝莉猫,但当约翰逊看到一段他认为特别滑稽的片段,有人摔倒,然后被一只带键盘的猫“放下舞台”时,他的朋友们认为这很蹩脚。“我说,这会很大。”他说,“我的朋友们说,‘不,这只是一只猫。’”

    将匹配如下:

    他们称加菲猫为加菲猫减去加菲猫和萝莉猫,但当约翰逊看到一段他认为特别滑稽的片段,一个人摔倒,然后被一只带键盘的猫“放下舞台”时,他的朋友们认为这是蹩脚的

    “我说,这将是一个大问题。”他说,“我的朋友们说,‘不,它只是一只猫。’”


    这个模式在ruby中对我很有用。一旦你将它转换成r,在python中应该很好

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


    Elliott

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

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

    他落地了-砰在地上


    “站住!”他喊道


    500万人死亡

    我不知道这些示例如何与自然语言句子的纯regexp匹配

    编辑:

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

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


    他敲了敲桌子,“再也没有了!”彼得说,然后离开了房间

    在字符级别上,两者看起来完全相同(引号后面的大写字母,等等),但是第一个应该被解析成两个句子,第二个应该被解析成一个句子。这取决于一个像人类一样理解智慧的人是否能看到这两种情况是不同的。技术字符不显示此信息。

    这对您有帮助吗

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

    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
    

    我觉得你最后一个例子中的标点符号很奇怪。当然应该是
    “我说,这将是一个大问题。”他说,“我的朋友们说,‘不,'这只是一只猫’”
    我需要了解一下正则表达式,这让我现在有点沮丧@谢谢,我想你是对的。我来编辑这个问题。你好。一个句子叫什么?对于您的模式,您将无法捕获延伸到几行的内容,因为模式的点与换行符不匹配
    \n
    。为什么你要抓住第一句话前面的内容而不是后面的内容?@eyquem谢谢,我更新了正则表达式模式。我在使用:([A-Z].*?\”.*?\。*?\)我是法国人。“短语”和“句子”这两个词在法语和英语之间的翻译非常混乱。法语单词短语表示文本中两点之间的任何内容,法语单词句子表示英语中的condamination或maxim。但是当我读英语单词短语和句子时,我从来没有清楚明白地理解它们所指的是什么。所以我几乎不理解你的问题这就是我害怕的。我最初使用nltk拆分句子,然后查看它们,但由于它以一种非常严格的方式拆分句子,我决定尝试使用正则表达式。即使它不完美,我也很乐意改进我的正则表达式模式。@Alfe你是说
    “停!”他喊道。
    500万人死亡。
    不会被抓到,因为他们不是以大写字母开头的?关于第一个,没有引号,你对这个示例的意思是什么?是的,我所有示例的一个方面是,它们与指定“一个句子以大写字母开头,只包含字母和非结束符(逗号、连字符……)并以结束符结尾”的天真方法相矛盾(句号、感叹号、问号等)。“我又添加了两个示例,这两个示例清楚地表明,在所有情况下,仅仅进行字符分析并不能成功地正确识别句子。您编辑的示例非常好。我完全同意您的观点:一个程序无法区分两个