对于字符串"//div[@id~'objectnavigator-card-list']//li[@class~'outbound-alert-settings']"
,我希望找到"@..'...'"
或"@id~'objectnavigator-card-list'"
之类的"@class~'outbound-alert-settings'"
。但是当我使用正则表达式((@.+)\~(\'.*?\'))
时,它会找到"@id~'objectnavigator-card-list']//li[@class~'outbound-alert-settings'"
。那么如何修改正则表达式以成功找到字符串?
答案 0 :(得分:3)
在内部括号上使用非捕获,非贪婪的修饰符,而不是搜索终止字符,例如:
re.findall(r"((?:@[^\~]+)\~(?:\'[^\]]*?\'))", test)
在测试字符串上返回:
["@id~'objectnavigator-card-list'", "@class~'outbound-alert-settings'"]
答案 1 :(得分:1)
限制引号之间匹配的字符与引号不匹配:
>>> re.findall(r'@[a-z]+~\'[-a-z]*\'', x)
我发现只查找我知道将在匹配部分中的字符更容易,而不是从更宽松的匹配中省略字符。
答案 2 :(得分:1)
对于当前测试字符串的输入,您可以尝试以下模式:
import re
a = "//div[@id~'objectnavigator-card-list']//li[@class~'outbound-alert-settings']"
# find everything which begins by '@' and neglect ']'
regex = re.compile(r'(@[^\]]+)')
strings = re.findall(regex, a)
# Or simply:
# strings = re.findall('(@[^\\]]+)', a)
print(strings)
输出:
["@id~'objectnavigator-card-list'", "@class~'outbound-alert-settings'"]