当前位置: 首页 > 知识库问答 >
问题:

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

桂嘉年
2023-03-14

我试图匹配所有包含引号的句子,独立于引号的长度或引号内的句子数量。

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

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

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

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

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

  1. 通常前面有空格

正如阿尔夫指出的那样,这并不能涵盖所有的句子,但如果我能满足这些条件,那就足够了。

例如:

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

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

更复杂的例子:

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

整句话都很相配。

但是

他们称加菲尔德为减去加菲尔德和Lollipop,但是当约翰逊看到他认为是一个特别滑稽的片段时,一个人摔倒了,然后被一只拿着键盘的猫“扮演下台”,他的朋友们认为这是蹩脚的。“我说,这将是一件大事。”他说,“我的朋友们说,‘不,它只是一只猫。’"

将匹配如下:

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

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

共有3个答案

云宾鸿
2023-03-14

这个模式在ruby中对我很有效。在python中将其转换为r“”后,应该可以正常使用

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

艾略特

汪正卿
2023-03-14

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

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

他落地了-砰在地上。

“停下!”他喊道。

500万人死亡。

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

编辑:

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

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

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

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

鄢松
2023-03-14

这对你有帮助吗?

请注意,我编辑的第一个答案很愚蠢,因为其中的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
 类似资料:
  • 我面临一个挑战,要以以下格式匹配输入: 输入由key=value对组成。关键字以斜杠开头。值可以是数字或引号中的字符串。 该值可以选择性地包含转义引号,即引号后面跟着引号(“”)。这种转义引号应该被视为价值的一部分。不需要检查转义引号是否平衡(例如,由另一个转义引号结束)。 正则表达式应该匹配序列中给定的key=value部分,并且对于长输入(例如value是10000个字符)不应该中断。

  • 我有一个非常好的正则表达式,它从文本中选择引用: 但是我需要一个正则表达式,它从没有引号的文本中选择引号。 例如,我有: 鲸鱼包括八个现存的家族:“鲸豚科”(白鲸),“鲸豚科”(露脊鲸),“鲸豚科”(侏儒露脊鲸),“白鲸科”(灰鲸),“独角鲸科”(白鲸和独角鲸),“抹香鲸科”(抹香鲸)。。。 我需要在引号之间提取文本: 龟甲翅目,龟甲翅目,龟甲翅目,... 要提取括号之间的文本,我使用正则表达式:

  • 问题内容: 从这个问题,我推断出不可能匹配给定正则表达式的所有实例而不是引号。也就是说,它不能匹配转义的引号(例如:)。如果有我不知道的方法可以解决我的问题。 但是,如果没有,我想知道在JavaScript中是否可以使用任何有效的替代方法。我已经考虑了一下,但是无法提供任何适用于大多数(即使不是全部)情况的优雅解决方案。 具体来说,我只需要使用.split()和.replace()方法的替代方法,

  • 问题内容: 匹配字符串中的’(’的正则表达式是什么? 以下是场景: 我有一串 我想使用正则表达式拆分字符串。为此,我正在使用 但是我收到以下异常。 转义似乎不起作用。 问题答案: 两种选择: 首先,你可以使用转义 回 斜线- 另外,由于它是单个字符,因此您可以将其放入不需要转义的字符类中-

  • 问题内容: 我正在解析的字符串中可能包含任意数量的带引号的字符串(我在解析代码,并尝试避免使用PLY)。我想找出是否有子字符串被引用,并且我有子字符串索引。我最初的想法是使用re查找所有匹配项,然后找出它们代表的索引范围。 似乎我应该将re与类似的正则表达式一起使用(目前,我避免使用三引号和此类字符串)。当我使用findall()时,会得到一个匹配字符串的列表,虽然有些不错,但我需要索引。 我的子

  • 出于某种原因,上面的正则表达式没有捕捉带撇号的名称。 例如:D'STALL先生不匹配。任何关于regex模式的帮助都将不胜感激。 代码所做的是获取输入并用XML标记它。诸如以下内容: 正则表达式与上述段落不匹配。