我有多个字符串,比如
string1 = """[[拱|{{{#!html}}}]][br]팔짱낄 공''':'''"""
string2 = """[[顆|{{{#!html}}}]][br]낟알 과'''-'''[* some annotation that may include quote marks(', ") and brackets("(", ")", "[[", "]]").]"""
string3 = """[[廓|{{{#!html}}}]][br]둘레 곽[br]클 확[* another annotation.][* another annotation.]"""
strings = [string1, string2, string3]
每个字符串都包含一个或多个“[br]”
每个字符串可能包含注释,也可能不包含注释
每个注释都以“[*”开头,以“]”结尾。它可能包括双括号(“[[”和“]]”),但绝不包括单括号(“[”和“]”),因此不会出现任何混淆(例如,[*某些注释带有[[括号]])
我要替换的单词是第一个“[br]”和注释之间的单词(如果有,则为字符串末尾),它们是
word1 = """팔짱낄 공''':'''"""
word2 = """낟알 과'''-'''"""
word3 = """둘레 곽[br]클 확"""
所以我试过了
for string in strings:
print(re.sub(r"\[br\](.)+?(\[\*)+", "AAAA", string))
期待像这样的事情
[[拱|{{{#!html}}}]][br]AAAA
[[顆|{{{#!html}}}]][br]AAAA[* some annotation that may include quote marks(', ") and brackets("(", ")", "[[", "]]").]
[[廓|{{{#!html}}}]][br]AAAA[* another annotation.][* another annotation.]
正则表达式的逻辑是
\[br\]
:第一个“[br]”
(.)+?
:我要替换的一个或多个字符,lazy
(\[\*)+
:一个或多个“[*”s
但结果是
[[拱|{{{#!html}}}]][br]팔짱낄 공''':'''
[[顆|{{{#!html}}}]]AAAA some annotation that may include quote marks(', ") and brackets("(", ")", "[[", "]]").]
[[廓|{{{#!html}}}]]AAAA another annotation.][* another annotation.]
相反,我也尝试了r"\[br\](.)+?(\[\*)*"
,但仍然不起作用。我如何解决这个问题
我能想到的最好办法是首先检查是否有任何注释:
它给出了预期的输出:
我想您可以将if移到replace函数中,但我不确定这是否会有很大的改进。它看起来像:
你可以用
模式匹配
^
字符串的开头(.*?\[br])
捕获组1,匹配尽可能少的字符,直到第一次出现[br]
.+?
匹配任意字符1+次(?=
正向前瞻,在右侧断言\[\*.*?](?<!].)(?!])
匹配[*
直到]
不被]
包围|
或$
断言字符串的结尾)
关闭前瞻替换为捕获组1和
AAAA
类似\1AAAA
Regex demoPython demo
示例代码
输出
相关问题 更多 >
编程相关推荐