匹配包含点的字符串

时间:2016-03-14 13:53:59

标签: python

我试图在文本文件中找到一些单词并替换它们。 我已经在变量中存储了要替换的单词。例如:

[Table("adm.OrdenesTrabajo")]
public class OrdenTrabajo
{
    [Key]
    public Guid Id { get; set; }

    [Required]
    public Int32 Consecutivo { get; set; }

    [Required]
    public DateTime FechaIngreso { get; set; }

    [Required]
    public Guid RemolcadorId { get; set; }

    [Required]
    [MaxLength(1000)]
    public String Justificacion { get; set; }

    [Required]
    public Int16 Prioridad { get; set; }

    [Required]
    public Guid EstadoMantenimientoId { get; set; }

    [Required]
    public String Usuario { get; set; }

    [ForeignKey("RemolcadorId")]
    public Equipo Remolcador { get; set; }

    [ForeignKey("EstadoMantenimientoId")]
    public EstadoMantenimiento EstadoMantenimiento { get; set; }
}

所以,在文中我需要找到" COR00g1.1 SolycCB00g000010 "单词并替换为" COR00g1.1"。问题是" COR00g1.1"实际上是匹配另一个单词。 例如:

输入:

SolycCB00g000010

输出:

ch00    assembler   exon    1146259 1146582 .   -   .   ID=exon2;Parent=COR00g1.1.2,COR00g1.1.3

ch00    assembler   transcript  4197578 4197801 .   +   .   Parent=COR00g131.1;ID=COR00g131.1.1;official=no

可以看出,第二行也被新ID替换,但不应该。

这是我使用的代码:

ch00 assembler  exon    1146259 1146582 .   -   .   ID=exon2;Parent=SolycCB00g000010.2,SolycCB00g000010.3

ch00 assembler  transcript  4197578 4197801 .   +   . Parent=SolycCB00g000010.1;ID=SolycCB00g000010.1.1;official=no

1 个答案:

答案 0 :(得分:2)

  

我知道这个问题,但我不知道如何避免它

您正在寻找已定义的子字符串而不是模式,因此首先不要使用正则表达式。

简单子字符串替换看起来像:

line[8] = line[8].replace('COR00g1.1', 'SolycCB00g000010')

如果必须使用正则表达式,则需要转义.,以便将其视为文字字符:例如。

search = 'COR00g1\.1'

编辑:解决此评论:

  

我有一个要替换的单词列表,我正在调用一个函数来逐个替换它们

并不意味着你需要使用正则表达式,它只是意味着你需要使用变量。例如:

def searchAndReplace(search, replace):
    # your code here
    line[8] = line[8].replace(search, replace)

传递一个预期正则表达式的文字字符串,然后修改该字符串以希望逃避所有特殊的正则表达式字符是所有世界中最糟糕的。

如果您只想要简单的子字符串匹配,那么使用正则表达式没有任何好处,并且您增加了相当大的复杂性。要解释众所周知的Jamie Zawinski quote,您在没有任何好处的情况下创建了一个额外的问题。