正则表达式模糊匹配未按预期工作

2024-10-01 04:46:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我想找到与另一个值匹配的值,该值的最大替换数为max_sub。你知道吗

我做了以下工作:

item = 'ASDDGH'
Ref = 'ASDDGY'
max_sub = 1
rx = re.compile(item+ '{s<=' + str(max_sub) + "}")
rx.search(Ref)

返回如下预期结果:

<regex.Match object; span=(0, 6), match='ASDDGY', fuzzy_counts=(1, 0, 0)>

但是,如果我这样做:

item = 'ASDDGH'
Ref = 'ASDAGY'
max_sub = 2
rx = re.compile(item+ '{s<=' + str(max_sub) + "}")
rx.search(Ref)

我没有得到匹配,即使字符串之间只有两个替换。你知道吗

我做错什么了?你知道吗

编辑:

谢谢,我帮你搞定了。你知道吗

但是,我想知道为什么会出现匹配:

item = 'WARQENW'
Ref = 'WARQRFWTAPLFDYW'
max_sub = 7
rx = re.compile("(" + item+ '){s<=' + str(max_sub) + "}")
rx.search(Ref)

item和Ref的长度不一样,所以不仅仅是替换,但是输出表明只做了2个sub。你知道吗


Tags: rerefsearchobjectmatchitemrxmax
3条回答

下面是重构@Data类中变量的getter/setter的一个小解决方案。这在eclipse和其他地方可能也适用:

示例类,我们想在其中将“value”重构为“value2”:

import lombok.Data;
@Data
public class Thing {
    int value;
}

(1)将变量重命名(不要重构)为临时变量,以删除lombak为原始名称生成的getter/setter。在引用旧getter/setter的任何地方都会出现编译错误,但这是暂时的:

@Data
public class Thing {
    int valueXXX; // reference to getValue() are broken for the moment
}

(2)手动为旧名称创建一个伪getter/setter。您的编译错误现在将消失:

@Data
public class Thing {
    int valueXXX;
    public int getValue() { return 0; }
    public void setValue(int value) {}
}

(3)使用eclipse重构虚拟getter/setter。代码库中的所有引用现在都使用getValue2()和setValue2()

@Data
public class Thing {
    int valueXXX; // 
    public int getValue2() { return 0; }
    public void setValue2(int value) {}
}

(4)删除重命名的伪getter/setter,并将变量名从临时名称更改为新名称。现在,一切又都变傻了:

@Data
public class Thing {
    int value2;
}

诚然,这有点烦人,但实际上并不需要那么长时间,而且肯定比手工更改数百个参考文献要好

我最近遇到的一个:

在IntelliJ(不了解Eclipse)中,不能提取包含lombok生成的任何方法的接口。它们不会出现在相关对话框中

有一个简单的解决方法:让IntelliJ创建方法,提取接口,还原类,然后让它再次实现接口

对于更复杂的重构,我选择了“delombok refactor relombok”。这是一种很重的方法,但在处理复杂的重构时不需要中间中断的构建

在我的例子中,我使用maven进行构建。我为lombok:delombok添加了maven构建插件,配置如下:

<build>
    <plugins>
        <plugin>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok-maven-plugin</artifactId>
            <version>1.18.6.0</version>
            <configuration>
                <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
                <addOutputDirectory>>false</addOutputDirectory>
            </configuration>
            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>delombok</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

这使得delombok副本在目标目录下很容易获得

要重构特定的lombok类:

  1. 注释掉原来的课堂内容
  2. 替换为目标/生成源/delombok中的delombok类内容
  3. 保存(代码编译干净)
  4. 在IDE中执行重构(代码编译干净)
  5. 对注释掉的原始lombok类内容执行相同的重构
  6. 删除delomok类内容
  7. 取消对重构lombok类内容的注释
  8. 保存(代码编译干净)

我希望那些第一次尝试重构lombok类的人对此持怀疑态度。我是在其他技术和更复杂的龙目巨人功能(如@Builder、@SuperBuilder)的挫折和局限之后才来到这里的

例如,为@Builder手动添加setter需要正确声明匹配的lombok生成的内部生成器类。这对于lombok@SuperBuilder继承这样的功能来说变得更加困难。当我尝试手动执行此操作时,我决定以delombok类为指导。就在那时,我意识到替换delombok源代码,随意重构,然后删除它更简单

相关问题 更多 >