簡體   English   中英

正則表達式替換

[英]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的匹配項,並且兩者之間沒有任何右括號,即xxxfoobar

>>> 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM