【问题标题】:Group replacement with re sub in python在python中使用re sub进行组替换
【发布时间】:2017-09-23 10:39:24
【问题描述】:

我有一个文本文件,我需要在其中替换几个单词。 文件内容是

user "username"
password "P@ssword"
dbname "SOME_DB_NAME"

我正在尝试这个

r = re.compile('{}\s"([\w@#$%^&*]+)"'.format('password'))
r.sub('new_passw0rd', file)

结果中 re.sub 替换了正则表达式匹配的所有符号如何只替换匹配的组?

【问题讨论】:

  • 捕获您需要保留的内容并在替换模式中使用反向引用。见this regex demo。你在寻找这个结果吗,"P@ssword" password
  • r.sub('password "new_passw0rd"', file)
  • @WiktorStribiżew 我正在寻找这个结果:密码“new_passw0rd”
  • 那你在这里甚至不需要组。
  • 查看我的第一条评论——你只是不要使用反向引用。捕获所有其余部分。

标签: python regex python-3.x


【解决方案1】:

正则表达式匹配一些文本字符串,并且有一种捕获机制,可以在找到匹配项后存储子匹配项,以后可以引用/重用。

所以,抓住你需要保留的东西并匹配其余部分。在您的情况下,您需要在新密码周围保留password、空格和"

使用

import re

s = """
user "username"
password "P@ssword"
dbname "SOME_DB_NAME"
"""
r = re.compile(r'({}\s")[\w@#$%^&*]+"'.format('password'))
print(r.sub(r'\1new_passw0rd"', s))

请参阅Python demo

输出:

user "username"
password "new_passw0rd"
dbname "SOME_DB_NAME"

这里,(password\s") 匹配并捕获 password+一个空格+" 到第 1 组(稍后用 \1 反向引用进行引用 - 注意 r'' 原始字符串声明)和 [\w@#$%^&*]+"仅匹配 1+ 个单词和一些特殊字符,后跟 "(也可以捕获,但我只是在替换中使用了 " 将其放回结果中)。

【讨论】:

    猜你喜欢
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    相关资源
    最近更新 更多