【发布时间】:2013-10-27 17:26:52
【问题描述】:
我需要实现一个 Python 正则表达式来搜索所有出现的 A1a 或 A_1_a 或 A-1-a 或 _A_1_a_ 或 _A1a,其中:
-
A可以是A到Z。 -
1可以是1 到 9。 -
a可以是a 到 z。
其中只有三个字符的字母数字字母,用下划线、破折号或什么都没有分隔。搜索字符串中的大小写需要完全匹配。
我遇到的主要问题是,有时这三个字母组合通过破折号和下划线连接到其他文本。还创建相同的正则表达式来搜索A1a、A-1-a 和A_1_a。
另外我忘了说这是一个 XML 文件。
感谢这找到了我正在寻找的每一次轻微修改 [-]?[A][-]?[1][-]?[a][-]?,但我需要这些是变量,比如
[-]?[var_A][-]?[var_3][-]?[Var_a][-]?
会这样吗
regex = r"[-]?[%s][-]?[%s][-]?[%s][-]?"
print re.findall(regex,var_A,var_Num,Var_a)
或者更像:
regex = ''.join(['r','\"','[-]?[',Var_X,'][-]?[',Var_Num,'][-]?[',Var_x,'][-]?','\"'])
print regex
for sstr in searchstrs:
matches = re.findall(regex, sstr, re.I)
但这不起作用
文件的示例行: 运行脚本之前
<t:ION t:SA="BoolObj" t:H="2098947" t:P="2098944" t:N="AN7 Result" t:CI="Boolean_Register" t:L="A_3_a Fdr2" t:VS="true">
<t:ION t:SA="RegisterObj" t:H="20971785" t:P="20971776" t:N="ART1 Result 1" t:CI="NumericVariable_Register" t:L="A3a1 Status" t:VS="1">
<t:ION t:SA="ModuleObj" t:H="2100736" t:P="2097152" t:N="AND/OR 14" t:CI="AndOr_Module" t:L="A_3_a**_2 Energized from Norm" t:S="0" t:SC="5">
运行脚本后 我得到的是:(它正在删除整行,只留下下面的内容)
- B_1_c
- B1c1
- B_1_c_2
我想得到什么:
<t:ION t:SA="BoolObj" t:H="2098947" t:P="2098944" t:N="AN7 Result" t:CI="Boolean_Register" t:L="B_1_c Fdr2" t:VS="true">
<t:ION t:SA="RegisterObj" t:H="20971785" t:P="20971776" t:N="ART1 Result 1" t:CI="NumericVariable_Register" t:L="B1c1 Status" t:VS="1">
<t:ION t:SA="ModuleObj" t:H="2100736" t:P="2097152" t:N="AND/OR 14" t:CI="AndOr_Module" t:L="B_1_c_2 Energized from Norm" t:S="0" t:SC="5">
import re
import os
search_file_name = 'Alarms Test.fwn'
pattern = 'A3a'
fileName, fileExtension = os.path.splitext(search_file_name)
newfilename = fileName + '_' + pattern + fileExtension
outfile = open(newfilename, 'wb')
def find_ext(text):
matches = re.findall(r'([_-]?[A{1}][_-]?[3{1}][_-]?[a{1}][_-]?)', text)
records = [m.replace('3', '1').replace('A', 'B').replace('a', 'c') for m in matches]
if matches:
outfile.writelines(records)
return 1
else:
outfile.writelines(text)
return 0
def main():
success = 0
count = 0
with open(search_file_name, 'rb') as searchfile:
try:
searchstrs = searchfile.readlines()
for s in searchstrs:
success = find_ext(s)
count = count + success
finally:
searchfile.close()
print count
if __name__ == "__main__":
main()
【问题讨论】:
-
A1A1A应该返回什么? IOW,潜在的重叠呢? -
你想匹配开头的下划线/破折号吗?换句话说,
_A_1_a_的匹配项应该是_A_1_a_还是A_1_a? -
是的,XMDC_A1a 或 XMDC-A1a 或 XMDC_A1-a XMDC_A_1_a_Current 都在同一个文件中。
-
@rtsnhth 这些解决方案之一对您有用吗?如果是,请接受并关闭问题。
标签: python regex search replace python-2.6