我需要实现一个Python正则表达式来搜索所有出现的A1a
或A_1_a
或A-1-a
或_A_1_a_
或_A1a
,其中:< / p>
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">
运行脚本后 我得到的是:(它正在删除整行,只留下下面的内容)
我想得到的:
<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()
答案 0 :(得分:1)
您想使用以下内容查找匹配项。
matches = re.findall(r'([_-]?[a-z][_-]?[1-9][_-]?[a-z][_-]?)', s, re.I)
如果您要查找匹配项,请删除所有-
,_
字符,您可以这样做。
import re
s = '''
A1a _A_1 A_ A_1_a A-1-a _A_1_a_ _A1a _A-1-A_ a1_a A-_-5-a
_A-_-5-A a1_-1 XMDC_A1a or XMDC-A1a or XMDC_A1-a XMDC_A_1_a_ _A-1-A_
'''
def find_this(text):
matches = re.findall(r'([_-]?[a-z][_-]?[1-9][_-]?[a-z][_-]?)', text, re.I)
records = [m.replace('-', '').replace('_', '') for m in matches]
print records
find_this(s)
输出
['A1a', 'A1a', 'A1a', 'A1a', 'A1a', 'A1A', 'a1a', 'A1a', 'A1a', 'A1a', 'A1a', 'A1A']
请参阅working demo
答案 1 :(得分:1)
快速获取A1a
没有标点符号,而不必从捕获的部分重建字符串......
t = '''A1a _B_2_z_
A_1_a
A-1-a
_A_1_a_
_C1c '''
re.findall("[A-Z][0-9][a-z]",t.replace("-","").replace("_",""))
输出:
['A1a', 'B2z', 'A1a', 'A1a', 'A1a', 'C1c']
(但如果你不想要从FILE.TXT-2b
捕获,那么你必须要小心这些解决方案......)
答案 2 :(得分:0)
如果字符串可以用多个下划线或短划线分隔(例如A__1a
):
[_-]*[A-Z][_-]*[1-9][_-]*[a-z]
如果只有一个或零个下划线或短划线:
[_-]?[A-Z][_-]?[1-9][_-]?[a-z]
答案 3 :(得分:0)
regex = r"[A-Z][-_]?[1-9][-_]?[a-z]"
print re.findall(regex,some_string_variable)
应该有效
只是抓住您感兴趣的部分将它们包裹在parens中
regex = r"([A-Z])[-_]?([1-9])[-_]?([a-z])"
print re.findall(regex,some_string_variable)
如果下划线或短划线或缺少必须匹配或者它将返回不良结果,则需要状态机,而正则表达式是无状态的