【问题标题】:Re.sub not working for meRe.sub 不适合我
【发布时间】:2011-12-23 10:03:40
【问题描述】:

我正在尝试让re.sub 替换指定为例如值的模式

for lines in f:
    pattern='\${2}'+key[0]+'\${2}'
    re.search(pattern,lines)

这将返回找到模式的行。例如,如果得到,这是测试返回之一

这是一个 $$test$$

我遇到的问题是当我执行以下操作时

re.sub(pattern,key[1],lines)

什么都没有发生。我错过了什么?欲了解更多信息key[0]=testkey[1]=replace 所以我想做的是每当遇到“$$test$$”时,它都会用“replace”替换它。我找到“$$test$$”没有问题,但由于某种原因re.sub 没有替换它。

【问题讨论】:

  • 当您需要在字符串中存储反斜杠时,最好使用双反斜杠形式。在您的情况下,它在 Python 中仍然有效,因为美元符号在以反斜杠为前缀时没有特殊含义,并且因为在这种情况下 Python 维护两个字符,但在其他语言中编写 '\$' 将仅表示 '$'。当某人正在阅读一个字符串并发现一个反斜杠时,需要一些特殊的东西或另一个反斜杠。如果您需要在字符串中使用多个反斜杠,那么您应该使用原始字符串...
  • 对于登陆这里并遇到一般re.sub 问题的人,make sure 您将re.IGNORECASE 作为flags= 参数传递,而不是count 参数。

标签: python regex


【解决方案1】:

正在re.sub 的结果分配回一个变量,对吗?例如

lines = re.sub(pattern, key[1], lines)

它是一个字符串,因此不能更改(字符串在 Python 中是不可变的),因此会创建一个新字符串并将其返回给您。如果您不将其重新分配给名称,您将丢失它。

【讨论】:

  • 啊,我以为它取代了它。我将如何替换文件中的这一行?顺便说一句,谢谢。我不敢相信这没有发生在我身上
  • 在文件中,您将从输入文件中读取每一行并将其写入输出文件;最后,如果需要,删除原始文件并重命名输出文件。或者,如果文件适合内存,您可以将其完全读入内存,进行更改,然后将其写回同一个文件。有很多关于 SO 和 Web 上其他地方的示例可以使用 Python 执行此操作。
  • 非常感谢。你帮了大忙。
  • 为了保持相关问题/答案链接的乐趣,我会发布这个:stackoverflow.com/questions/19598121/…
【解决方案2】:

如果你有一个文本,你可以直接在整个文本上运行 re.sub() 如下:

import re

ss = '''that's a line
another line
a line to $$test$$
123456
here $$test$$ again
closing line'''

print(ss,'\n')

key = {0:'test', 1:'replace'}

regx = re.compile('\$\${[0]}\$\$'.format(key))

print( regx.sub(key[1],ss) )

.

如果你读取一个文件,你应该有兴趣阅读整个文件并将其放入对象 ss 中,然后再对其运行 re.sub() ,而不是逐行读取和替换

.

如果你有行列表,你必须如下处理:

import re

key = {0:'test', 1:'replace'}

regx = re.compile('\$\${[0]}\$\$'.format(key))

lines = ["that's a line",
         'another line',
         'a line to $$test$$',
         '123456',
         'here $$test$$ again',
         'closing line']

for i,line in enumerate(lines):
    lines[i] =  regx.sub(key[1],line)

否则包含“$$test$$”的行将不会被修改:

import re

key = {0:'test', 1:'replace'}

regx = re.compile('\$\${[0]}\$\$'.format(key))

lines = ["that's a line",
         'another line',
         'a line to $$test$$',
         '123456',
         'here $$test$$ again',
         'closing line']

for line in lines:
    line =  regx.sub(key[1],line)


print (lines)

结果

["that's a line", 'another line', 'a line to $$test$$', '123456', 'here $$test$$ again', 'closing line']

【讨论】:

    猜你喜欢
    • 2017-01-27
    • 1970-01-01
    • 2018-03-14
    • 2011-08-11
    • 2011-01-05
    • 2012-04-01
    • 2011-05-02
    • 2012-12-07
    相关资源
    最近更新 更多