正则表达式:用en-dashes替换连字符和re.sub

时间:2017-07-10 01:47:14

标签: python regex unicode

我正在使用一个小函数来循环文件,以便任何连字符-被en-dashes 替换(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}(-),因为搜索实际上是在乳胶回归表上执行的,我只想替换数字周围的连字符。

要明确:在我们拥有\cmidrule(lr){2-4}等真正的乳胶代码的情况下,我想要替换所有连字符 EXCEPT

  • 在这种情况下,{关闭(最多3-4个字符)到hyphen及其左侧。当然,这个连字符不应该改成en-dash,否则乳胶代码会破裂。

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

我表中的典型行是

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

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

这是什么问题? 谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

re.sub取代整场比赛。在这种情况下,包含{之前的非-字符。您可以将该位括在括号中以创建\1组并将其包含在您的替换中(您的周围也不需要括号):

re.sub(r"([^{]{1,4})-",r"\1–", str)