4

ファイル内の文字列、つまり「H3」を「H1」に置き換えようとしていますが、「mmoleculeH3」ではなく「H3」のみを「mmmoleculeH1」に置き換えたいと考えています。私は re を試しましたが、Python に関する私の限られた知識ではどこにも行きませんでした。それ以外の方法がある場合、私が現在使用しているgreat.scriptは次のとおりです。

#!/usr/bin/python

import fileinput
import sys
def replaceAll(file,searchExp,replaceExp):
    for line in fileinput.input(file, inplace=1):
        if searchExp in line:
            line = line.replace(searchExp,replaceExp)
        sys.stdout.write(line)

replaceAll("boxFile.cof","H3","H1")

reを使用せずにこれ自体でそれを行う方法があれば、それは素晴らしいことです。よろしくお願いします。

4

2 に答える 2

6

他の人が言ったように、これは正規表現が適切なツールである場合です。

を使用して、単語全体のみを置き換えることができます\b

>>> text = 'H3 foo barH3 H3baz H3 quH3ux'
>>> re.sub(r'\bH3\b', 'H1', text)
'H1 foo barH3 H3baz H1 quH3ux'
于 2013-09-13T11:42:33.300 に答える
3

私は正規表現なしでこれを行うことに興味があったので、ここに正規表現なしのバージョンがあります:

MYSTR = ["H3", "H3b", "aH3", "H3 mmmoleculeH3 H3",
         "H3 mmmoleculeH3 H3b", "H3 mmmoleculeH3 H3b H3"]
FIND = "H3"
LEN_FIND = len( FIND )
REPLACE = "H1"

for entry in MYSTR:
    index = 0
    foundat = []
    # Get all positions where FIND is found
    while index < len( entry ):
        index = entry.find( FIND, index )
        if index == -1:
            break
        foundat.append( index )
        index += LEN_FIND

    print "IN: ", entry,
    for loc in foundat:
        # Check if String is starting with FIND
        if loc == 0:
            # Check if String only contains FIND
            if LEN_FIND == len( entry ):
                entry = REPLACE
            # Check if the character after FIND is blank
            elif entry[LEN_FIND] == " ":
                entry = entry[:loc] + REPLACE + entry[loc + LEN_FIND:]
        else:
            # Check if character before FIND is blank
            if entry[loc - 1] == " ":
                # Check if FIND is the last part of the string
                if loc + LEN_FIND + 1 > len( entry ):
                    entry = entry[:loc] + REPLACE + entry[loc + LEN_FIND:]
                # Check if character after FIND is blank
                elif entry[loc + LEN_FIND] == " ":
                    entry = entry[:loc] + REPLACE + entry[loc + LEN_FIND:]

    print " OUT: ", entry

出力は次のとおりです。

IN:  H3  OUT:  H1
IN:  H3b  OUT:  H3b
IN:  aH3  OUT:  aH3
IN:  H3 mmmoleculeH3 H3  OUT:  H1 mmmoleculeH3 H1
IN:  H3 mmmoleculeH3 H3b  OUT:  H1 mmmoleculeH3 H3b
IN:  H3 mmmoleculeH3 H3b H3  OUT:  H1 mmmoleculeH3 H3b H1

PS: Daniel Roseman のソリューションを希望します。

于 2013-09-13T12:27:55.130 に答える