我有一个这样的字符串:
LD(_030S.F.IN)OR(_080T_SAF_OUT)COIL(xxSF[4].Flt[120].0)
我只想查找OR(_080T_SAF_OUT)COIL(xxSF[4].Flt[120].0)
,但是OR
也可以是LD
。 _080T_SAF_OUT
可能会有所不同,有时总是用字母数字和下斜杠表示。 COIL(xxSF[4].Flt[120].0)
,必须始终为COIL(xxSF["digits"].Flt["digits"]."digits")
我正在尝试使用Python 2.7的re库。
m = re.search('\OR|\LD'+'\('+'.+'+'\)'+'+'\COIL+'\('+'\xxSF+'\['+'\d+'+'\].'+ Flt\['+'\d+'+'\]'+'\.'+'\d+', Text)
我的输出:
OR(abc_TEST_X)LD(xxSF[16].Flt[0].22
OR
LD(TEST_X_dsfa)OR(WASS_READY)COIL(xxSF[16].Flt[11].10
第一个是正确的,我要丢弃第二个和第三个。
我认为问题出在这里:
'\('+'.+'+'\)'
因为我只想在第一对paréntesis之间找到一些字母数字的内容,并且可能带有符号,所以我没有过滤这种情况。
答案 0 :(得分:0)
您应该对(?:LD|OR)
之类的替代字符进行分组,并匹配(
和)
以外的任何字符,您可以使用[^()]*
而不是.+
({{ 1}}尽可能匹配任何字符,因此它在括号内匹配。
这里是Python demo:
.+
模式详细信息
import re
Text = 'LD(_030S.F.IN)OR(_080T_SAF_OUT)COIL(xxSF[4].Flt[120].0)'
m = re.search(r'(?:OR|LD)\([^()]*\)COIL\(xxSF\[\d+]\.Flt\[\d+]\.\d+', Text)
if m:
print(m.group()) # => OR(_080T_SAF_OUT)COIL(xxSF[4].Flt[120].0
-与(?:OR|LD)
或OR
匹配的非捕获组LD
-一个\(
字符(
-否定的字符类,与除[^()]*
和(
之外的0+个字符匹配)
-\)COIL\(xxSF\[
子字符串)COIL(xxSF[
-1个以上数字\d+
-]\.Flt\[
子字符串].Flt[
-1个以上数字,\d+]\.\d+
子字符串和1个以上数字请参见regex demo。
提示在].
之前添加\b
,以使它们作为整个单词(而不是(?:OR|LD)
和NOR
的一部分)匹配。
答案 1 :(得分:0)
谢谢,我正在捕捉我想要的一切。只是要过滤的其他东西。看一下一些输出:
OR(_1B21_A53021_2_En)OR(_1_A21_Z53021_2)COIL(xxSF [9] .Flt [15] .3);
LD(_1B21_A53021_2_En)LD(_1_A21_Z53021_2)COIL(xxSF [9] .Flt [15] .3);
我只想按如下方式捕获最后一个“ LD”或“ OR”:
OR(_1_A21_Z53021_2)COIL(xxSF [9] .Flt [15] .3);
LD(_1_A21_Z53021_2)COIL(xxSF [9] .Flt [15] .3);