Skip to main content
 首页 » 编程设计

python之正则表达式:使用 re.sub 将连字符替换为破折号

2024年08月20日35itcoder

我正在使用一个小函数来遍历文件,以便所有连字符 - 都被破折号 – (alt + 0150) 替换。

我使用的函数为相关问题 (how to replace a character INSIDE the text content of many files automatically?) 的解决方案添加了一些正则表达式风格

def mychanger(fileName): 
  with open(fileName,'r') as file: 
    str = file.read() 
    str = str.decode("utf-8") 
    str = re.sub(r"[^{]{1,4}(-)","–", str).encode("utf-8") 
  with open(fileName,'wb') as file: 
    file.write(str) 

我使用正则表达式 [^{]{1,4}(-) 因为搜索实际上是在 latex 回归表上执行的,我只想替换出现在数字周围的连字符。

明确一点:如果我们有真正的 Latex 代码,例如 \cmidrule(lr){2-4},我想替换所有连字符 EXCEPT。

  • 在这种情况下,{ 紧邻(最多 3-4 个字符)连字符 及其左侧。当然,这个连字符不应更改为破折号,否则 latex 代码会被破坏。

  • 我认为排除的左侧部分条件对于在正则表达式中编写正确的异常很重要。实际上,在回归表中,您可以使用 -0.062\sym{***}(即连字符右侧的 {)和这种情况我确实想替换连字符。

我表格中的典型行是

variable    &   -2.061\sym{***}&       4.032\sym{**}   &       1.236         \\ 
            &      (-2.32)         &   (-2.02)         &      (-0.14)     

但是,我的正则表达式似乎不正确。例如,(-1.2) 将被替换为 –1.2,去掉括号。

这里有什么问题? 谢谢!

请您参考如下方法:

我可以提供以下两步替换:

str = "-1 Hello \cmidrule(lr){2-4} range 1-5 other stuff a-5" 
str = re.sub(r"((?:^|[^{])\d+)-(\d+[^}])","\\1$\\2", str).encode("utf-8") 
str = re.sub(r"(^|[^0-9])-(\d+)","\\1$\\2", str).encode("utf-8") 
print(str) 

第一个替换目标是所有不是 LaTex 形式 {1-9} 的范围,即不包含在大括号内。第二个替换目标是所有以非数字或字符串开头为前缀的数字。

Demo