Python正则表达式查找字母数字字母指定的所有组合

时间:2013-10-18 18:46:32

标签: python regex search replace python-2.6

我需要实现一个Python正则表达式来搜索所有出现的A1aA_1_aA-1-a_A_1_a__A1a,其中:< / p>

  • A可以是 A到Z
  • 1可以 1到9
  • a可以是 a到z

其中只有三个字母的数字字母,由下划线,破折号或无分隔。搜索字符串中的大小写需要完全匹配。

我遇到的主要问题是有时这三个字母组合通过破折号和下划线连接到其他文本。同时创建相同的正则表达式以搜索A1aA-1-aA_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()

4 个答案:

答案 0 :(得分:1)

您想使用以下内容查找匹配项。

matches = re.findall(r'([_-]?[a-z][_-]?[1-9][_-]?[a-z][_-]?)', s, re.I)

请参阅regex101 demo

如果您要查找匹配项,请删除所有-_字符,您可以这样做。

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)

如果下划线或短划线或缺少必须匹配或者它将返回不良结果,则需要状态机,而正则表达式是无状态的