我试图匹配所有包含引号的句子,独立于引号的长度或引号内的句子数量。
正如Alfe所指出的,得到一个完美的正则表达式可能是不可行的,但是如果可能的话,我想改进我正在使用的正则表达式。
现在我这样做是为了找到报价:
def split_by_quotes(text):
pattern = r'([A-Z].*?\".*?\".*?\.)'
quotes = re.findall(pattern, text)
return(quotes)
但是我想确保引用出现在一个句子中,然后捕捉整个句子。
我所说的一句话是指一段文字:
正如阿尔夫指出的那样,这并不能涵盖所有的句子,但如果我能满足这些条件,那就足够了。
例如:
“这是一个报价,应该匹配”
这是多个回车后新行上没有引号的文本,不应匹配。
更复杂的例子:
查尔斯·巴贝奇说:“有两次,议员们问我[],‘巴贝奇先生,祈祷一下,如果你把错误的数字输入机器,正确的答案会出来吗?’我无法正确理解可能引发这样一个问题的思想混乱。"
整句话都很相配。
但是
他们称加菲尔德为减去加菲尔德和Lollipop,但是当约翰逊看到他认为是一个特别滑稽的片段时,一个人摔倒了,然后被一只拿着键盘的猫“扮演下台”,他的朋友们认为这是蹩脚的。“我说,这将是一件大事。”他说,“我的朋友们说,‘不,它只是一只猫。’"
将匹配如下:
他们称加菲猫为加菲猫减去加菲猫和萝莉猫,但当约翰逊看到一段他认为特别滑稽的片段,一个人摔倒,然后被一只带键盘的猫“放下舞台”时,他的朋友们认为这是蹩脚的。
和
“我说,这将是一件大事。”,他说,“我的朋友们说,‘不,它只是一只猫。’”
这个模式在ruby中对我很有效。在python中将其转换为r“”后,应该可以正常使用
/([a-zA-Z,\']\“[^.]\.)/
艾略特
我认为你想做的事情不能用正则表达式来完成。
自然语言是一件复杂的事情,即使是书面语言也不像看上去那么容易。有几件事我想指出,以明确哪些特殊情况是我得出结论的基础:
他落地了-砰在地上。
“停下!”他喊道。
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
我面临一个挑战,要以以下格式匹配输入: 输入由key=value对组成。关键字以斜杠开头。值可以是数字或引号中的字符串。 该值可以选择性地包含转义引号,即引号后面跟着引号(“”)。这种转义引号应该被视为价值的一部分。不需要检查转义引号是否平衡(例如,由另一个转义引号结束)。 正则表达式应该匹配序列中给定的key=value部分,并且对于长输入(例如value是10000个字符)不应该中断。
我有一个非常好的正则表达式,它从文本中选择引用: 但是我需要一个正则表达式,它从没有引号的文本中选择引号。 例如,我有: 鲸鱼包括八个现存的家族:“鲸豚科”(白鲸),“鲸豚科”(露脊鲸),“鲸豚科”(侏儒露脊鲸),“白鲸科”(灰鲸),“独角鲸科”(白鲸和独角鲸),“抹香鲸科”(抹香鲸)。。。 我需要在引号之间提取文本: 龟甲翅目,龟甲翅目,龟甲翅目,... 要提取括号之间的文本,我使用正则表达式:
问题内容: 从这个问题,我推断出不可能匹配给定正则表达式的所有实例而不是引号。也就是说,它不能匹配转义的引号(例如:)。如果有我不知道的方法可以解决我的问题。 但是,如果没有,我想知道在JavaScript中是否可以使用任何有效的替代方法。我已经考虑了一下,但是无法提供任何适用于大多数(即使不是全部)情况的优雅解决方案。 具体来说,我只需要使用.split()和.replace()方法的替代方法,
问题内容: 匹配字符串中的’(’的正则表达式是什么? 以下是场景: 我有一串 我想使用正则表达式拆分字符串。为此,我正在使用 但是我收到以下异常。 转义似乎不起作用。 问题答案: 两种选择: 首先,你可以使用转义 回 斜线- 另外,由于它是单个字符,因此您可以将其放入不需要转义的字符类中-
问题内容: 我正在解析的字符串中可能包含任意数量的带引号的字符串(我在解析代码,并尝试避免使用PLY)。我想找出是否有子字符串被引用,并且我有子字符串索引。我最初的想法是使用re查找所有匹配项,然后找出它们代表的索引范围。 似乎我应该将re与类似的正则表达式一起使用(目前,我避免使用三引号和此类字符串)。当我使用findall()时,会得到一个匹配字符串的列表,虽然有些不错,但我需要索引。 我的子
出于某种原因,上面的正则表达式没有捕捉带撇号的名称。 例如:D'STALL先生不匹配。任何关于regex模式的帮助都将不胜感激。 代码所做的是获取输入并用XML标记它。诸如以下内容: 正则表达式与上述段落不匹配。