python特定数据替换问题~小白求教

lixinivy_32 2012-10-29 05:49:16
就是文件longwire.ddb中有很多条(COND fanout=o4_1_4p_0_8p (IOPATH in muxo ((264:264:264) (264:264:264)))这样的句子。。。从中挑选出含有两个小写字母p的行然后从另外一个文件oct_4.txt中读取第六列的所有数据。。。替换掉这一句式的最后六个数字,就是例句中的264.。。总共有72行数据,从p4_1_4p_0_8p到p4_8_4p_8_8p,也就是说从(1,0)……(1,8)(2,0)……(8.8)自己写了一个下午试了两种方法,一种是直接写出这样的句式,用循环语句,更新掉最后的264这样的数据,另外一种就是找到数据找到点然后更新,但是都写的不正确啊。。。因为接触python没多久只能写出最简单的那种。。。求教啊~QAQ
...全文
9740 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
crifan 2012-11-12
  • 打赏
  • 举报
回复
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
python特定数据替换问题~小白求教
http://bbs.csdn.net/topics/390262414


(COND fanout=o4_1_4p_0_8p (IOPATH in muxo ((264:264:264) (264:264:264)))
(COND fanout=o4_1_4p_1_8p (IOPATH in muxo ((264:264:264) (264:264:264)))
(COND fanout=o4_1_4p_2_8p (IOPATH in muxo ((264:264:264) (264:264:264)))
...
(COND fanout=o4_1_4p_8_8p (IOPATH in muxo ((264:264:264) (264:264:264)))
(COND fanout=o4_2_4p_0_8p (IOPATH in muxo ((264:264:264) (264:264:264)))
...
(COND fanout=o4_2_4p_8_8p (IOPATH in muxo ((264:264:264) (264:264:264)))
(COND fanout=o4_3_4p_0_8p (IOPATH in muxo ((264:264:264) (264:264:264)))
...
(COND fanout=o4_8_4p_8_8p (IOPATH in muxo ((264:264:264) (264:264:264)))

Version:    2012-11-05
Author:     Crifan
"""

import re;

testStrList = [
    """(COND fanout=o4_1_4p_0_8p (IOPATH in muxo ((264:264:264) (264:264:264)))
(COND fanout=o4_1_4p_1_8p (IOPATH in muxo ((274:274:274) (274:274:274)))
(COND fanout=o4_1_4p_2_8p (IOPATH in muxo ((124:124:124) (124:124:124)))
(COND fanout=o4_1_4p_8_8p (IOPATH in muxo ((251:251:251) (251:251:251)))
(COND fanout=o4_2_4p_0_8p (IOPATH in muxo ((320:320:320) (320:320:320)))
(COND fanout=o4_2_4p_8_8p (IOPATH in muxo ((264:264:264) (264:264:264)))
(COND fanout=o4_3_4p_0_8p (IOPATH in muxo ((598:598:598) (598:598:598)))
(COND fanout=o4_8_4p_8_8p (IOPATH in muxo ((342:342:342) (342:342:342)))""",
];

for eachTestStr in testStrList:
    foundAll2p = re.findall(".+?_\d+_\d+p_\d+_\d+p.+?\(\((?P<numToReplace>\d+):(?P=numToReplace):(?P=numToReplace)\)\s+?\((?P=numToReplace):(?P=numToReplace):(?P=numToReplace)\)\)\)", eachTestStr);
    
    if(foundAll2p):
        for each2p in foundAll2p:
            print "each2p=%s"%(each2p);
            # each2p=264
            # each2p=274
            # each2p=124
            # each2p=251
            # each2p=320
            # each2p=264
            # each2p=598
            # each2p=342
            
            #接着你自己处理每个字符串,进行你所需要的替换即可
另外,关于group的用法,专门写了教程,你可以参考参考: 【教程】详解Python正则表达式之: (…) group 分组
Sinchb 2012-11-09
  • 打赏
  • 举报
回复
引用 5 楼 lixinivy_32 的回复:
引用 3 楼 的回复:\S代表非空白字符 \s代表空白字符 我能再问一下group的用法么。。。都没找到。。。我oct4.txt我格式是下面这样 load1= load2= rise fall mean 1 0 267 261 264 1 1 271 266 268 1 2 274 270 272 1 3 278 275 276 1 4 282 280 ……
在re模块里面: group(num=0) 返回全部匹配对象(或指定编号是num 的子组) groups() 返回一个包含全部匹配的子组的元组(如果没有成功匹配,就返回一个空元 组) LZ需要看些正则方面的资料
lixinivy_32 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

\S代表非空白字符
\s代表空白字符
[/Quote]
哦~~~谢谢~^ ^
zjs100901 2012-10-30
  • 打赏
  • 举报
回复
\S代表非空白字符
\s代表空白字符
lixinivy_32 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

我写了个,由于不太清楚oct_4.txt的格式,我就这么定义吧:
col1 col2 col3 col4 col5 001 002 003 004 005 006
col1 col2 col3 col4 col5 011 012 013 014 015 016
...共72行
然后不知道怎么修改原来的文件,所以我先输出到output.ddb里面

Python code
impor……
[/Quote]
好像挺有用的但是有一些看不太懂。。请问那些/S是什么意思。。。不能直接用需要再修改一下
lixinivy_32 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

是不是要把一行的3个数字重复一遍,变成6个数字,替换到longwire.ddb中去,如果是的话,看看这样:
Python code
import re

strReplaceText = []

def test():
ReadReplaceText()
ReplaceSource()

def ReadReplaceText():
infile = open( 'o……
[/Quote]
提示是list index out of range我想做的是把oct4.txt文件中的第五列数字全部取出来然后重复六次更新到longwire.ddb中那六个数字。。。那数字是一样的都是oct4.txt的第五列数据。。。非常感谢你QAQ
zjs100901 2012-10-30
  • 打赏
  • 举报
回复
是不是要把一行的3个数字重复一遍,变成6个数字,替换到longwire.ddb中去,如果是的话,看看这样:
import re

strReplaceText = []

def test():
ReadReplaceText()
ReplaceSource()

def ReadReplaceText():
infile = open( 'oct_4.txt', 'r' )
for line in infile:
m = re.match( '\d+\s\d+\s(\d+)\s(\d+)\s(\d+)', line )
if m is not None:
strReplaceText.append( list( m.groups() ) )
infile.close()

def ReplaceSource():
infile = open( 'longwire.ddb', 'r' )
outfile = open( 'output.ddb', 'w' )
index = 0
for line in infile:
AppearCount = line.count( 'p' )
if AppearCount == 2:
m = re.match( '.+\((\d+):(\d+):(\d+)\) \((\d+):(\d+):(\d+)\)', line )
if m is not None:
replace = '('
replace += strReplaceText[index][0]
replace += ':'
replace += strReplaceText[index][1]
replace += ':'
replace += strReplaceText[index][2]
replace += ')'
replace *= 2
line = re.sub( '\((\d+):(\d+):(\d+)\) \((\d+):(\d+):(\d+)\)', replace, line )
index = index + 1
outfile.write( line )

outfile.close()
infile.close()

if __name__ == '__main__' :
test()
zjs100901 2012-10-30
  • 打赏
  • 举报
回复
正则表达式函数
group(num=0) 返回全部匹配对象(或指定编号是num 的子组)
groups() 返回一个包含全部匹配的子组的元组(如果没有成功匹配,就返回一个空元组
lixinivy_32 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

\S代表非空白字符
\s代表空白字符
[/Quote]
我能再问一下group的用法么。。。都没找到。。。我oct4.txt我格式是下面这样
load1= load2= rise fall mean
1 0 267 261 264
1 1 271 266 268
1 2 274 270 272
1 3 278 275 276
1 4 282 280 281
1 5 286 285 285
1 6 290 290 290
1 7 294 295 294
1 8 298 300 299
2 0 271 267 269
2 1 275 272 273
2 2 279 276 277
2 3 283 281 282
2 4 287 286 286
2 5 291 292 291
2 6 295 297 296
2 7 299 303 301
实在是不会写脚本可是工作中必须要用到QAQ
zjs100901 2012-10-29
  • 打赏
  • 举报
回复
我写了个,由于不太清楚oct_4.txt的格式,我就这么定义吧:
col1 col2 col3 col4 col5 001 002 003 004 005 006
col1 col2 col3 col4 col5 011 012 013 014 015 016
...共72行

然后不知道怎么修改原来的文件,所以我先输出到output.ddb里面

import re

strReplaceText = []

def test():
ReadReplaceText()
ReplaceSource()

def ReadReplaceText():
infile = open( 'oct_4.txt', 'r' )
for line in infile:
m = re.match( '\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)', line )
if m is not None:
OneRecord = []
OneRecord.append( m.group( 1 ) )
OneRecord.append( m.group( 2 ) )
OneRecord.append( m.group( 3 ) )
OneRecord.append( m.group( 4 ) )
OneRecord.append( m.group( 5 ) )
OneRecord.append( m.group( 6 ) )
strReplaceText.append( OneRecord )
infile.close()

def ReplaceSource():
infile = open( 'longwire.ddb', 'r' )
outfile = open( 'output.ddb', 'w' )
index = 0
for line in infile:
AppearCount = line.count( 'p' )
if AppearCount == 2:
m = re.match( '.+\((\d+):(\d+):(\d+)\) \((\d+):(\d+):(\d+)\)', line )
if m is not None:
replace = '('
replace += strReplaceText[index][0]
replace += ':'
replace += strReplaceText[index][1]
replace += ':'
replace += strReplaceText[index][2]
replace += ') ('
replace += strReplaceText[index][3]
replace += ':'
replace += strReplaceText[index][4]
replace += ':'
replace += strReplaceText[index][5]
replace += ')'
line = re.sub( '\((\d+):(\d+):(\d+)\) \((\d+):(\d+):(\d+)\)', replace, line )
index = index + 1
outfile.write( line )

outfile.close()
infile.close()

if __name__ == '__main__' :
test()

37,718

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧