【问题标题】:Regex between quotes look ahead - Python引号之间的正则表达式向前看 - Python
【发布时间】:2016-02-01 20:27:27
【问题描述】:

我有这个:

myText = str(^123"I like to"^456&U"play video games and"$"eat cereal")

我想提取引号之间(包括引号)之间的所有内容,拆分$ 符号之前和之后的所有内容,并将它们附加到嵌套列表中。例如

myTextList = [["我喜欢","玩电子游戏和"],["吃麦片"]]

这是我尝试过的:

tempTextList = []
for text in re.findall('(?<=\$)"[^"]*"(?<!\^)',myText,re.DOTALL)
    tempTextList.append(text)
myTextList.append(tempTextList)

我使用了https://www.regex101.com/#python 网站并尝试了几乎所有我能想到的...

(?!\$)"(?!\^\00\+\-\&amp;)[^"].*" 等等……

re.findall 部分并没有真正按照我想要的方式工作。

有人能指出正确的方向吗?

谢谢

【问题讨论】:

  • 您希望您的结果出现在像引号一样的列表中吗?还是没有?
  • 你可以同时显示。我认为'"[^"]*"' 显示带引号的结果,"(.*?)" 显示不带引号的结果。
  • 你想先在$上拆分然后找到引用的吗?
  • 引号之间可能有多个句子,引号外带有(有时不带有)$ 符号。
  • 如果我的回答对您有用,请考虑接受。

标签: python regex lookahead


【解决方案1】:

您可以将"[^"]*" 正则表达式与re.findall 一起使用:

import re
s = 'myText = str(^123"I like to"^456&U"play video games and"$"eat cereal")'
print(re.findall(r'"[^"]*"', s))

demo

它匹配您需要的双引号子字符串和双引号:['"I like to"', '"play video games and"', '"eat cereal"']

请注意,"[^"]*" 匹配 " 后跟零个或多个字符,而不是 " 后跟 "

如果需要获取"..."里面的内容不带双引号,可以使用捕获机制:

r'"([^"]*)"'

re.findall 只会返回第 1 组中的捕获。请参阅another demo

【讨论】:

  • 哇,真快!谢谢@WiktorStribizew。另外,以防万一我不想要双引号子字符串,我会使用类似"(.*?)" 而不是'"[^"]*"',对吗?
  • 您可以捕获双引号内的内容。您可以使用r'"([^"]*)"' 和访问group(1)。请注意,.*? 仅在您使用 DOTALL 修饰符并且模式末尾有多个 " 时才有效。请注意,re.findall 只会返回捕获的子字符串列表。
  • 如果需要匹配内部转义的实体,也可以使用r'"[^"\\]*(?:\\.[^"\\]*)*"'(或r'"([^"\\]*(?:\\.[^"\\]*)*)"'获取不带双引号的捕获)。
  • 这可能是最有用的正则表达式模式之一。它可以成为快速、强大的标记化的灵丹妙药。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 2012-01-27
相关资源
最近更新 更多