当前位置: 首页 > 面试题库 >

空字符串,而不是不匹配的组错误

茹轩昂
2023-03-14
问题内容

我有这段代码:

for n in (range(1,10)):
    new = re.sub(r'(regex(group)regex)?regex', r'something'+str(n)+r'\1', old, count=1)

它将引发不匹配的组错误。但是,如果不匹配,我想在那里添加空字符串,而不是抛出错误。我怎样才能做到这一点?

注意:我的完整代码比此示例复杂得多。但是,如果您找到更好的解决方案,如何遍历比赛并在其中添加数字,则可以共享。我的完整代码:

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)

问题答案:

在Python
3.5之前的版本中,对Pythonre.sub中失败的捕获组的反向引用未使用空字符串填充。这是在bugs.python.org上的Bug1519638描述。因此,当使用对未参与比赛的组的反向引用时,将导致错误。

有两种方法可以解决该问题。

解决方案1:添加空替代项以使可选组成为必需项

您可以将所有可选捕获组(如的构造(\d+)?)替换为带有空替代项(即(\d+|))的强制性捕获组。

这是失败的示例:

import re
old = 'regexregex'
new = re.sub(r'regex(group)?regex', r'something\1something', old)
print(new)

更换一条线与

new = re.sub(r'regex(group|)regex', r'something\1something', old)

有用。

解决方案2:在替换中使用lambda表达式并检查该组是否不是 None

如果您在另一个可选组中有可选组,则此方法是必需的。

您可以使用lambda在更换零件来检查组被初始化,不Nonelambda m: m.group(n) or ''在您的情况下
请使用此解决方案
,因为替换模式中有两个后向引用-#3和#4-但是某些匹配项(请参见Match
1和3)没有初始化捕获组3。发生这种情况是因为整个第一部分-(\s*\{{2}funcA(ka|)\s*\|\s*([^}]*)\s*\}{2}\s*|)不参与比赛,并且
即使添加了一个空的替代项 ,内部的Capture组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)

应该用

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)

见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'


 类似资料:
  • 问题内容: 由于空字符串是Go的零/默认值,因此我决定将所有此类字段定义为。例如 如果该值不适用于该特定字段,则我正在发送数据的应用程序期望使用null而不是空字符串。 这是正确的方法吗?或者有人可以向我指出比这更好的方法。 问题答案: 在json包文档中: 指针值编码为指向的值。nil指针编码为空JSON对象。 因此,您可以存储指向字符串的指针,如果不为nil,则将其编码为字符串;如果为nil,

  • 与有界通配符相关的编译器错误 Java:通配符类型不匹配导致编译错误

  • 既然我们可以在Javascript中使用关键字抛出任何东西,那么我们就不能直接抛出一个错误消息字符串吗? 有人知道这里面有什么陷阱吗? 让我对此添加一些背景:在JavaScript世界中,人们通常依赖参数检查而不是使用try-catch机制,因此只使用抛出致命错误是有意义的。不过,为了能够捕捉一些系统错误,我必须为我自己的错误使用一个不同的类,而不是创建错误的子类,我认为我应该只使用String。

  • 问题内容: 我正在编写一个Java实用程序,可以帮助我生成用于性能测试的数据负载。这将是真正冷却到能够指定弦乐正则表达式让我产生吐出来匹配这个哪些东西。有没有已经烤好的东西可以用来做呢?还是有一个图书馆可以带给我大部分帮助? 问题答案: 我正在编写一个Java实用程序,可以帮助我生成用于性能测试的数据负载。这将是真正冷却到能够指定弦乐正则表达式让我产生吐出来匹配这个哪些东西。有没有已经烤好的东西可

  • 问题内容: 我收到以下错误: 第一个字段是格式。 有任何想法吗? 谢谢。 问题答案: 当您将字符串值插入日期列时,则需要在使用函数期间将其转换为日期。使用此功能时,您将提供字符串的格式。 功能格式: 因此,您的查询将如下所示: 参见带有演示的SQL Fiddle

  • 我执行了一个简单的测试用例(在jobss-ejb环境中),它比较/断言2个字符串。 不幸的是,这些字符串彼此不匹配(有一个错误)。 但问题是,当我从eclipse执行测试用例时,它会将结果记录为失败,这是正确的,因为预期对象和实际对象之间存在不匹配; 而当我从ant执行相同的测试用例时,结果被记录为错误。 这真的很奇怪和令人惊讶,并且要补充更多,这种行为仅在junit4版本上被注意到,当我在jun