使用正则表达式,提取可能包含嵌套引号的带引号的字符串

coder.in.me

我有以下字符串:

'Well, I've tried to say "How Doth the Little Busy Bee," but it all came different!' Alice replied in a very melancholy voice. She continued, 'I'll try again.'

现在,我希望提取以下引号:

1. Well, I've tried to say "How Doth the Little Busy Bee," but it all came different!
2. How Doth the Little Busy Bee,
3. I'll try again.

我尝试了以下代码,但没有得到想要的东西。[^\1]*不会按预期工作。还是其他地方的问题?

import re

s = "'Well, I've tried to say \"How Doth the Little Busy Bee,\" but it all came different!' Alice replied in a very melancholy voice. She continued, 'I'll try again.'"

for i, m in enumerate(re.finditer(r'([\'"])(?!(?:ve|m|re|s|t|d|ll))(?=([^\1]*)\1)', s)):
    print("\nGroup {:d}: ".format(i+1))
    for g in m.groups():
        print('  '+g)
史蒂夫·钱伯斯

如果确实需要从仅应用一次的单个正则表达式返回所有结果,则有必要使用lookahead((?=findme)),以便在每次匹配后查找位置回到起始位置-有关更多详细说明,请参见此答案

为了防止错误匹配,还需要一些有关引号的条款,这些引号会增加复杂性,例如,撇号I've不应视为开头或结尾的引号。没有单一的明确方法可以做到这一点,但是我追求的规则是:

  1. 开头引号不得紧接在单词字符(例如字母)之后。因此,例如,A"不会算作开头报价,而是,"算在内。
  2. 右引号后不得紧接文字字符(例如字母)。因此,例如,'B不算作结束语,而是'.算作。

应用上述规则将导致以下正则表达式:

(?=(?:(?<!\w)'(\w.*?)'(?!\w)|\"(\w.*?)\"(?!\w)))

正则表达式可视化

Debuggex演示

对任何可能的候选正则表达式进行快速的健全性检查的方法是将引号反转。这已在此regex101演示中完成

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用正则表达式捕获不带引号的双引号内的字符串

PHP 正则表达式提取带引号和括号的子字符串

如何使用正则表达式从引号之间提取包含所需字符串的组?

正则表达式检索带引号的字符串和引号字符

无法在ruby中使用正则表达式突出显示带引号的字符串

如何使用正则表达式查找带引号的字符串

使用正则表达式在字符串中查找多个带引号的单词

正则表达式-用开始和结束引号替换带引号的字符串

Java正则表达式,用于将带引号的字符串与转义的引号匹配

正则表达式匹配忽略双引号的带引号的字符串

正则表达式可以匹配任何带引号的字符串或特定的不带引号的字符串

正则表达式以匹配可能包含''''''''的单引号字符串

正则表达式解析带引号的子字符串的查询,并返回单个单词的嵌套列表

使用正则表达式提取前两个引号内的字符串?

查找格式错误的带引号的字符串的正则表达式

正则表达式用_(Sublime)替换带引号的字符串中的空格

Golang正则表达式替换不包括带引号的字符串

正则表达式查找带引号的字母的字符串

正则表达式查找带引号的字符串中的所有大括号

Haskell,正则表达式,TDFA:匹配(并删除)带引号的子字符串

正则表达式提取双引号和引号 R 中的字符串

正则表达式提取单引号或双引号之外的字符串

C#使用正则表达式解析包含双引号和单引号的字符串

使用Perl正则表达式替换引号封装字符串中的引号

如何使用正则表达式匹配单引号或双引号中的字符串

正则表达式提取逗号之间的字符串,但包括引号

PHP棘手的正则表达式获取带引号的字符串直到某些单词

如何使用正则表达式分隔双引号字符串和非双引号字符串?

用于提取双引号和非引号字符串的正则表达式模式Javascript