前瞻以获得引号内的值

时间:2016-08-16 21:18:31

标签: python regex

不执行python split,获取以下内容的正则表达式是什么:

s = '[@Country="US"][@Language="ES"]'

["US", "ES"]

我使用的当前版本不会在第二个引号和括号"]之前停止:

re.findall(r'=\"(.+)?\"\]', s)

这里正确的正则表达式是什么?

4 个答案:

答案 0 :(得分:2)

你只需要一个否定的角色类:

="([^"]+)"

请参阅regex demo

<强>详情:

  • =" - 文字="文字
  • ([^"]+) - 第1组(这将由re.findall返回)除"以外的1个或多个字符
  • " - 双引号。

注意:如果里面只有大写的ASCII字母,您可以使用="([A-Z]+)"使图案更精确。

Python demo

import re
p = re.compile(r'="([^"]+)"')
s = '[@Country="US"][@Language="ES"]'
print(p.findall(s))
# => ['US', 'ES']

答案 1 :(得分:1)

正则表达式是贪婪的:意味着正则表达式匹配可能与正则表达式匹配的最大字符串,因为您在结束括号之前接受任何字符。 如果您接受任何字符但关闭括号可以按照您的意愿使用。

re.findall(r'=\"([^\]]+)?\"\]', s)

或使用+?激活非贪婪模式或正则表达式。匹配括号后立即匹配。

re.findall(r'=\"(.+?)?\"\]', s)

答案 2 :(得分:1)

你的正则表达式几乎是正确的,试试这个:

re.findall(r'=\"(.+?)\"\]', s)

?应该在括号内

答案 3 :(得分:0)

我也会使用Wiktor的解决方案。如果你有一个一致的模式,其中组将总是包含在“”中,那么这样的事情应该做得很好。

import re

output = []

s = '[@Country="US"][@Language="ES"]'

regex = r'"([^"]+)"'

value = re.findall(regex, s)
output.append(value)

print(output)