ale*_*kva 7 python regex python-2.x
我有这段代码:
for n in (range(1,10)):
new = re.sub(r'(regex(group)regex)?regex', r'something'+str(n)+r'\1', old, count=1)
Run Code Online (Sandbox Code Playgroud)
它会抛出无法匹配的组错误.但如果它不匹配,我想在那里添加空字符串而不是抛出错误.我怎么能实现这个目标?
注意:我的完整代码比这个例子复杂得多.但是如果你找到更好的解决方案如何迭代匹配并在里面添加数字,你可以分享.我的完整代码:
for n in (range(1,(text.count('soutez')+1))):
text = re.sub(r'(?i)(\s*\{{2}infobox medaile reprezentant(ka)?\s*\|\s*([^\}]*)\s*\}{2}\s*)?\{{2}infobox medaile soutez\s*\|\s*([^\}]*)\s*\}{2}\s*', r"\n | reprezentace"+str(n)+r" = \3\n | soutez"+str(n)+r" = \4\n | medaile"+str(n)+r" = \n", text, count=1)
Run Code Online (Sandbox Code Playgroud)
在Python 3.5之前,Python中对失败的捕获组的反向引用re.sub没有填充空字符串.这是bugs.python.org上的Bug 1519638描述.因此,当对没有参与匹配的组使用反向引用时会导致错误.
有两种方法可以解决这个问题.
您可以将所有可选捕获组(这些构造类似(\d+)?)替换为具有空替代(即(\d+|))的必需捕获组.
以下是失败的示例:
import re
old = 'regexregex'
new = re.sub(r'regex(group)?regex', r'something\1something', old)
print(new)
Run Code Online (Sandbox Code Playgroud)
new = re.sub(r'regex(group|)regex', r'something\1something', old)
Run Code Online (Sandbox Code Playgroud)
有用.
None如果在另一个可选组中包含可选组,则此方法是必需的.
您可以使用lambda在更换零件来检查组被初始化,不None与lambda m: m.group(n) or ''.在您的情况下使用此解决方案,因为您在替换模式中有两个反向引用 - #3和#4 - 但是一些匹配(请参阅匹配1和3)没有初始化Capture组3.之所以发生这种情况,是因为整个第一部分 - (\s*\{{2}funcA(ka|)\s*\|\s*([^}]*)\s*\}{2}\s*|)没有参与比赛,内部的捕获组3(即([^}]*))在添加空替代之后也没有填充.
re.sub(r'(?i)(\s*\{{2}funcA(ka|)\s*\|\s*([^\}]*)\s*\}{2}\s*|)\{{2}funcB\s*\|\s*([^\}]*)\s*\}{2}\s*',
r"\n | funcA"+str(n)+r" = \3\n | funcB"+str(n)+r" = \4\n | string"+str(n)+r" = \n",
text,
count=1)
Run Code Online (Sandbox Code Playgroud)
应该重写
re.sub(r'(?i)(\s*{{funcA(ka|)\s*\|\s*([^}]*)\s*}}\s*|){{funcB\s*\|\s*([^}]*)\s*}}\s*',
lambda m: r"\n | funcA"+str(n)+r" = " + (m.group(3) or '') + "\n | funcB" + str(n) + r" = " + (m.group(4) or '') + "\n | string" + str(n) + r" = \n",
text,
count=1)
Run Code Online (Sandbox Code Playgroud)
请参阅IDEONE演示
import re
text = r'''
{{funcB|param1}}
*some string*
{{funcA|param2}}
{{funcB|param3}}
*some string2*
{{funcB|param4}}
*some string3*
{{funcAka|param5}}
{{funcB|param6}}
*some string4*
'''
for n in (range(1,(text.count('funcB')+1))):
text = re.sub(r'(?i)(\s*\{{2}funcA(ka|)\s*\|\s*([^\}]*)\s*\}{2}\s*|)\{{2}funcB\s*\|\s*([^\}]*)\s*\}{2}\s*',
lambda m: r"\n | funcA"+str(n)+r" = "+(m.group(3) or '')+"\n | funcB"+str(n)+r" = "+(m.group(4) or '')+"\n | string"+str(n)+r" = \n",
text,
count=1)
assert text == r'''
| funcA1 =
| funcB1 = param1
| string1 =
*some string*
| funcA2 = param2
| funcB2 = param3
| string2 =
*some string2*
| funcA3 =
| funcB3 = param4
| string3 =
*some string3*
| funcA4 = param5
| funcB4 = param6
| string4 =
*some string4*
'''
print 'ok'Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1321 次 |
| 最近记录: |