微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

提取包含某个单词的引号内的短语

如何解决提取包含某个单词的引号内的短语

我一直在寻找一种方法来查找段落中短语的最接近的引号或双引号。 例如,对于短语 -> AAAAA:

I am "looking for" a way that doesn't break: "Lorem
ipsum\" AAAAA" in this case. Or this AAAAA case. Or this 'AAAAA' case.
Isn't this annoying?

输出将是:

"Lorem ipsum \" AAAAA"  |  AAAAA  |  'AAAAA'

我真的在寻找任何好的方法来做到这一点(正则表达式/解析器或任何有效的方法都会被接受)。

我试图从 How can I match a quote-delimited string with a regex? 中获得一些灵感,但这并不是我真正想要的。

我尝试过的一个例子是这个(然后使用代码过滤掉包含“AAAAA”的匹配项。尽管在句子末尾有另一个 ' 时失败了。:

(["'])(?:\\\1|[\s\S])*?(AAAAA)?(?:\\\1|[\s\S])*?\1|AAAAA

如果有帮助,我将在 Python 代码中使用此解决方案。

谢谢!

解决方法

你可以使用

(?xs)
(?<!')(?:'{2})*\B('\b[^'\\]*(?:(?:\\.|\b'\b)[^'\\]*)*') # Single quoted string literal
|                                                       # or
(?<!")(?:"{2})*\B("\b[^"\\]*(?:(?:\\.|\b"\b)[^"\\]*)*") # Double quoted string literal

参见regex demo详情

  • (?xs) - 详细和 dotall 模式
  • (?<!') - 左侧不允许立即出现 '
  • (?:'{2})* - 零个或多个 '' 子串
  • \B - 左边必须有字符串开头或非单词字符
  • ('\b[^'\\]*(?:(?:\\.|\b'\b)[^'\\]*)*') - 第 1 组,单引号字符串文字模式:
    • '\b - 一个 ' 后必须跟一个字符字符
    • [^'\\]* - 除 '\ 之外的零个或多个字符
    • (?:(?:\\.|\b'\b)[^'\\]*)* - 零次或多次重复
      • (?:\\.|\b'\b) - 一个 \ 后跟任意一个字符或一个 ' 被单词字符包围
      • [^'\\]* - 除 '\ 之外的零个或多个字符
    • ' - 一个 ' 字符。
  • | - 或
  • (?<!")(?:"{2})*\B("\b[^"\\]*(?:(?:\\.|\b"\b)[^"\\]*)*") - 第 2 组:双引号字符串文字(类似于前面的单引号字符串文字模式)。

Python demo

import re
pattern = re.compile( r'''(?xs)
(?<!')(?:'{2})*\B('\b[^'\\]*(?:(?:\\.|\b'\b)[^'\\]*)*') # Single quoted string literal
|                                                       # or
(?<!")(?:"{2})*\B("\b[^"\\]*(?:(?:\\.|\b"\b)[^"\\]*)*") # Double quoted string literal
''')
 
text = "I am \"looking for\" a way that doesn't break: \"Lorem\nipsum\\\" AAAAA\" in this case. Or this AAAAA case. Or this 'AAAAA' case.\nIsn't this annoying?"
print(f"This is the text: {text}")
matches = [f'{x}{y}' for x,y in pattern.findall(text) if 'AAAAA' in f'{x}{y}']
print(matches)
# => ['"Lorem\nipsum\\" AAAAA"',"'AAAAA'"]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。