[英]Regex replacement
我有一個像這樣的字符串:
{{foobar
| option1 = foo
| option2 = foo
| <!-- more options -->
| something = xxx
| thisoption = xxx
| <!-- more options -->
}}
我希望它被“ thisoption = xxx”替換為“ thisoption = abc”。 它不應該與以下任何一項匹配:
{{foobar
| option1 = foo
| option2 = foo
| thisoption = xyz
}}
{{foobar
| option1 = foo
| option2 = foo
}}
{{someotherthing
| thisoption = xxx
}}
我怎樣才能做到這一點?
這個問題有點模糊,但是請嘗試以下操作:
re.sub(r'(?P<name>foobar[^}]* = xxx\b)', r'\g<name>2', string)
它尋找foobar
的匹配項和xxx
的匹配項,並且兩者之間沒有任何右括號,即xxx
在foobar
。
>>> string = '{{foobar\n| option1 = foo\n| option2 = foo\n| <!-- more options -->\n| thisoption = xxx\n| <!-- more options -->\n}}'
>>> re.sub(r'(?P<name>foobar[^\}]*xxx)', r'\g<name>2', string)
'{{foobar\n| option1 = foo\n| option2 = foo\n| <!-- more options -->\n| thisoption = xxx2\n| <!-- more options -->\n}}'
您的第一個測試用例; 在這種情況下,xxx將替換為xxx2。
>>> string = '{{foobar\n| option1 = foo\n| option2 = foo\n| thisoption = xyz\n}}'
>>> re.sub(r'(?P<name>foobar[^\}]*xxx)', r'\g<name>2', string)
'{{foobar\n| option1 = foo\n| option2 = foo\n| thisoption = xyz\n}}'
第二個測試用例; 什么都沒發生。
>>> string = '{{foobar\n| option1 = foo\n| option2 = foo\n}}\n{{someotherthing\n| thisoption = xxx\n}}'
>>> re.sub(r'(?P<name>foobar[^\}]*xxx)', r'\g<name>2', string)
'{{foobar\n| option1 = foo\n| option2 = foo\n}}\n{{someotherthing\n| thisoption = xxx\n}}'
第三測試用例; 再次沒有任何反應。
希望這可以幫助!
為了回答我自己的問題,這似乎可以解決問題:
re.sub(r"(\{\{foobar[^\}]*)thisoption ?= ?xxx", r"\1thisoption = abc", string)
感謝所有提供幫助的人!
您的示例看起來有點像INI設置文件,只是語法不同。 您應該檢查python的ConfigParser模塊,它已經處理了所有這些。
import re
ss = '''{{foobar
| option1 = foo
| option2 = foo
| <!-- more options -->
| something = xxx
| thisoption = xxx
| <!-- more options -->
}}'''
tt = '''{{foobar
| option1 = foo
| option2 = foo
| thisoption = xyz
}}'''
uu = '''{{foobar
| option1 = foo
| option2 = foo
}}
{{someotherthing
| thisoption = xxx
}}'''
regx = re.compile('(\{\{foobar *\r?\n'
'([^}]*\r?\n)+?'
'\| thisoption *= *)(xxx)')
for x in (ss,tt,uu,vv,zz):
print regx.sub('\\1abcd',x)
print
print re.sub(r'(?P<name>foobar[^\}]*xxx)', r'\g<name>2', x)
print '\n-----------------------------------------------------------'
結果
{{foobar
| option1 = foo
| option2 = foo
| <!-- more options -->
| something = xxx
| thisoption = abcd
| <!-- more options -->
}}
{{foobar
| option1 = foo
| option2 = foo
| <!-- more options -->
| something = xxx
| thisoption = xxx2
| <!-- more options -->
}}
-----------------------------------------------------------
{{foobar
| option1 = foo
| option2 = foo
| thisoption = xyz
}}
{{foobar
| option1 = foo
| option2 = foo
| thisoption = xyz
}}
-----------------------------------------------------------
{{foobar
| option1 = foo
| option2 = foo
}}
{{someotherthing
| thisoption = xxx
}}
{{foobar
| option1 = foo
| option2 = foo
}}
{{someotherthing
| thisoption = xxx
}}
-----------------------------------------------------------
正如我目前所看到的, Discipulus解決方案在以下情況下不起作用:
vv = '''{{foobar
| option1 = foo
| option2 = foo
| thisoption = xxx
| last_xxxxx_option = toxic
}}'''
zz = '''{{foobar
| option1 = foo
| option2 = foo
| thisoption = xxx
| last_option = toxxxic
}}'''
為此:
{{foobar
| option1 = foo
| option2 = foo
| thisoption = abcd
| last_xxxxx_option = toxic
}}
{{foobar
| option1 = foo
| option2 = foo
| thisoption = xxx
| last_xxxxx2_option = toxic
}}
-----------------------------------------------------------
{{foobar
| option1 = foo
| option2 = foo
| thisoption = abcd
| last_option = toxxxic
}}
{{foobar
| option1 = foo
| option2 = foo
| thisoption = xxx
| last_option = toxxx2ic
}}
-----------------------------------------------------------
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.