web-dev-qa-db-ja.com

Pythonのstring.replaceの正規表現

次の形式のパラメータファイルがあります。

parameter-name parameter-value

パラメータの順序は任意ですが、1行に1つのパラメータしかありません。 1つのパラメータのparameter-valueを新しい値に置き換えます。

私はPythonの string.replace(pattern, sub) を使う行を置き換えるためにline replace関数 以前にポストされた を使っています。私が使っている正規表現は、例えばvimでは動作しますが、string.replace()では動作しないようです。

これが私が使っている正規表現です。

line.replace("^.*interfaceOpDataFile.*$/i", "interfaceOpDataFile %s" % (fileIn))

ここで、"interfaceOpDataFile"は置き換えようとしているパラメータ名(大文字と小文字を区別しない場合は/ i)、新しいパラメータ値はfileIn変数の内容です。

Pythonにこの正規表現を認識させる方法はありますか、それともこのタスクを実行する別の方法がありますか?

331
Troy Rockwood

str.replace() v2 | v3 正規表現を認識しません。

正規表現を使用して置換を実行するには、re.sub()を使用してください。 v2 | v3

例えば:

import re

line = re.sub(
           r"(?i)^.*interfaceOpDataFile.*$", 
           "interfaceOpDataFile %s" % fileIn, 
           line
       )

ループの中では、最初に正規表現をコンパイルする方が良いでしょう。

import re

regex = re.compile(r"^.*interfaceOpDataFile.*$", re.IGNORECASE)
for line in some_file:
    line = regex.sub("interfaceOpDataFile %s" % fileIn, line)
    # do something with the updated line
465
Andrew Clark

re.sub 関数を探しています。

import re
s = "Example String"
replaced = re.sub('[ES]', 'a', s)
print replaced 

axample atringを印刷します

299

まとめとして

import sys
import re

f = sys.argv[1]
find = sys.argv[2]
replace = sys.argv[3]
with open (f, "r") as myfile:
     s=myfile.read()
ret = re.sub(find,replace, s)   # <<< This is where the magic happens
print ret
13
kpie

re.subは間違いなくあなたが探しているものです。そして、あなたは知っている、あなたはアンカーとワイルドカードを必要としない。

re.sub(r"(?i)interfaceOpDataFile", "interfaceOpDataFile %s" % filein, line)

同じことをするでしょう - "interfaceOpDataFile"のように見える最初の部分文字列を照合してそれを置き換えます。

9
Nelz11