如何解决提取包含某个单词的引号内的短语
我一直在寻找一种方法来查找段落中短语的最接近的引号或双引号。 例如,对于短语 -> 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
谢谢!
解决方法
你可以使用
(?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 组:双引号字符串文字(类似于前面的单引号字符串文字模式)。
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] 举报,一经查实,本站将立刻删除。