$給定一個字符串,我需要識別 a 后面可能被或可能不被 包圍的字段{ }:$verb = verb${verb}age = verb$$作為一種逃避,我需要考慮到這一點以及它可能在定界之前$。到目前為止我所擁有的是:reg = r'\$([_a-zA-Z0-9]*)'s = '$who likes $what're.findall(reg, s)['who', 'what']但我無法設計可選支撐的表達式,我嘗試過:reg = r'\$({?[_a-zA-Z0-9]*}?)'但這會獲取諸如以下的值:${who$who}能夠解釋可選支撐的適當表達式是什么?更新:當涉及到 previous 時$,以下內容將是無效字符串:$$verb = invalid$${verb} = invalid但這些都是有效的:$$$verb = $verb$$${verb} = $verb這是因為 a之后$$被替換為 single $。
2 回答

jeck貓
TA貢獻1909條經驗 獲得超7個贊
如果開頭{
與結尾相匹配,}
您可以使用 2 個交替的捕獲組,然后該值將位于組 1 或組 2 中。
如果 前面$
不應有另一個,$
您可以使用負向后查找(?<!\$)\$
,斷言左側不直接有美元符號。
\$(?:{([_a-zA-Z0-9]+)}|([_a-zA-Z0-9]+))\b
或者僅獲取值,您可以使用環視的替代
(?<=\$)[_a-zA-Z0-9]+\b|(?<=\${)[_a-zA-Z0-9]+(?=})
import re
regex = r"(?<=\$)[_a-zA-Z0-9]+\b|(?<=\${)[_a-zA-Z0-9]+(?=})"
test_str = ("$verb = verb\n"
"${verb}age = verb")
print(re.findall(regex, test_str))
輸出
['verb', 'verb']
編輯
對于更新的問題,例如使用捕獲組,您可以匹配一個或 3 個或更多美元符號,斷言前面的不是美元符號。
(?<!\$)(?:\$(?:\${2,})?)(?:{([_a-zA-Z0-9]+)}|([_a-zA-Z0-9]+))

牧羊人nacy
TA貢獻1862條經驗 獲得超7個贊
您可以通過以下方式獲得第二組匹配:
reg2 = '\$(?:{)([_a-zA-Z0-9]+)(?:})'
這使得支撐是強制性的,但沒有被捕獲......
添加回答
舉報
0/150
提交
取消