使用if语句查找和替换行内的字符串

时间:2012-08-30 04:35:05

标签: python string if-statement replace

我正在尝试解析特定的文本文件。我试图打开文本文件并逐行询问是否存在特定字符串(在下面的示例中,大括号中存在数字01),然后操纵特定字符串向前或向前转发,或保留它相同。这是一个例子,其中一行命名为“go”...(完整文件中的其他行具有相似的格式,但有{01}, {00}等...

go = 'USC_45774-1111-0     <hkxhk> {10} ; 78'

go = go.replace(go[22:24],go[23:21:-1])

>>> go
'USC_45774-1111-0     <khxkh> {10} ; 78'

我试图操纵第一个"hk" (go[22:24]),用相同的字母替换(go[23:21:-1)。我想要的是看khxhk,但正如你所看到的,结果我我得到的是两个都转向khxkh

我也遇到了为每一行执行特定if语句的问题。许多没有{01}的行被操纵,好像它们一样....

with open('c:/LG 1A.txt', 'r') as rfp:
with open('C:/output5.txt', 'w') as wfp:
    for line in rfp.readlines():
        if "{01}" or "{-1}" in line:
            line = line.replace(line[25:27],line[26:24:-1])   
            line = line.replace("<"," ")
            line = line.replace(">"," ")
            line = line.replace("x","   ")
            wfp.write(line)

        elif "{10}" or "{1-}" in line:
            line = line.replace(line[22:24],line[23:21:-1])   
            line = line.replace("<"," ")
            line = line.replace(">"," ")
            line = line.replace("x","   ")
            wfp.write(line)

        elif "{11}" in line:
            line = line.replace(line[22:27],line[26:21:-1])   
            line = line.replace("<"," ")
            line = line.replace(">"," ")
            line = line.replace("x","   ")
            wfp.write(line)

    wfp.close()

我错过了一些简单的东西吗?

3 个答案:

答案 0 :(得分:1)

字符串replace方法不会按位置替换字符,而是用它们的字符替换它们。

>>> 'apple aardvark'.replace('a', '!')
'!pple !!rdv!rk'

所以在你的第一个案例中,你要告诉用“kh”替换“hk”。它并不“知道”您只想替换其中一个事件;它只知道你想用“kh”代替“hk”,所以它取代了所有的事件。

您可以使用count参数进行替换,以指定您只想替换第一个匹配项:

>>> go = 'USC_45774-1111-0     <hkxhk> {10} ; 78'
... go.replace(go[22:24],go[23:21:-1],1)
'USC_45774-1111-0     <khxhk> {10} ; 78'

但请注意,这将始终替换第一个出现次数,而不一定是您指定的字符串中位置的出现次数。在这种情况下,我猜这就是你想要的,但它可能无法直接用于其他类似的任务。 (也就是说,没有办法使用此方法来替换第二次出现或第三次出现;您只能替换第一次,前两次或前三次等。要替换第二次或第三次你需要多做一些事情。)

至于问题的第二部分,你误解了if "{01}" or "{-1}" in line的含义。用外行人的话来说,这意味着if "{01}" or if "{-1}" in line。由于if "{01}"始终为真(即字符串“{01}”不是假值),因此整个条件始终为真。你想要的是if "{01}" in line or "{-1}" in line"

答案 1 :(得分:0)

我不知道Python是什么,但你的问题是每天至少发布几次。

if "{01}" or "{-1}" in line:

这不符合你的想法。它问,“"{01}"是真的吗?”因为它是一个非零长度的字符串,所以它是。由于or短路,因此第一个参数为真,因此未测试其余条件。因此,if语句的正文始终执行。

换句话说,Python评估就像你写的那样:

if ("{01}") or ("{-1}" in line):

你想要这样的东西:

if "{01}" in line or "{-1}" in line:

或者,如果你有很多类似的条件:

if any(x in line for x in ("{01}", "{-1}")):

答案 2 :(得分:0)

您可以使用replace()的计数参数:

'USC_45774-1111-0     <hkxhk> {10} ; 78'.replace("hk","kh",1)

对于第二个问题,您需要将条件更改为:

if "{01}" in line or "{-1}" in line:
    ...