私にとって、Martijnの解決策はうまくいきません。だから私は私の解決策を与えます。
私が使用していないという事実に注意してくださいre.IGNORECASE
したがって、私の正規表現は
PC_bos_7659Ae_1450sp_rev_2_1_nc_woof
I don't know if it is really what you want in this caseの最後をキャッチできます
inputtext = """XY_efgh_1234_0040_rev_2_1_NC_asdf
XY_abcd_1122Ae_1150_rev2_1_NC
XY_efgh_0124e_50_NC
asdf_1980_2234a_2
XY_abcd_5098_2270_2_1_NC
PC_bos_7659Ae_1450sp_rev_2_1_NC_GRAPH
PC_bos_7659Ae_1450sp_rev_2_1_nc_woof"""
print inputtext
.
import re
print """\n----------------------------------------
WANTED
('1234', '0040_rev_2_1')
('1122Ae', '1150_rev2_1')
('0124e', '50')
('1980', '2234a_2')
('5098', '2270_2_1')
('7659Ae', '1450sp_rev_2_1')"""
print '----------- eyquem ----------------------'
ri = re.compile('^\D+'
'(\d{4}[a-zA-Z]{0,3})'
'[_-]+'
'(.+?)'
'(?:[_-]+NC.*)?$',
re.MULTILINE)
for match in ri.findall(inputtext):
print match
print '----------- Martijn ----------------------'
ro = re.compile(
r"""
([0-9]{4}
[A-Z]{0,3})
[_-]{1,3}
([0-9]{2,4}
[0-9A-Z_-]{0,16}?)
(?:[-_]NC)?
""",
re.IGNORECASE | re.VERBOSE)
for match in ro.findall(inputtext):
print match
結果
----------------------------------------
WANTED
('1234', '0040_rev_2_1')
('1122Ae', '1150_rev2_1')
('0124e', '50')
('1980', '2234a_2')
('5098', '2270_2_1')
('7659Ae', '1450sp_rev_2_1')
----------- eyquem ----------------------
('1234', '0040_rev_2_1')
('1122Ae', '1150_rev2_1')
('0124e', '50')
('1980', '2234a_2')
('5098', '2270_2_1')
('7659Ae', '1450sp_rev_2_1')
('7659Ae', '1450sp_rev_2_1_nc_woof')
----------- Martijn ----------------------
('1234', '0040')
('1122Ae', '1150')
('0124e', '50')
('1980', '2234')
('5098', '2270')
('7659Ae', '1450')
('7659Ae', '1450')
私の正規表現は個々の行で使用できます::
for s in inputtext.splitlines(True):
print ri.match(s).groups()
同じ結果
.
編集
import re
inputtext = """XY_efgh_1234_0040_rev_2_1_NC_asdf
XY_abcd_1122Ae_1150_rev2_1_NC
XY_efgh_0124e_50_NC
XY_efgh_0228e_66-__NC
asdf_1980_2234a_2
asdf_2999_133a
XY_abcd_5098_2270_2_1_NC
XY_abcd_6099_33370_2_1_NC
XY_abcd_6099_3370abcd_2_1_NC
PC_bos_7659Ae_1450sp_rev_2_1_NC_GRAPH
PC_bos_7659Ae_1450sp_rev_2_1___NC_GRAPH
PC_bos_7659Ae_1450sp_rev_2_1_nc_woof_NC
PC_bos_7659Ae_1450sp_rev_2_1_anc_woof_NC
PC_bos_7659Ae_1450sp_rev_2_1_abNC_woof_NC"""
print '----------- Martijn 2 ------------'
ruu = re.compile(r"""
( [0-9]{4} [A-Z]{0,3} )
[_-]{1,3}
( [0-9]{2,4} (?:[0-9A-Z_-](?!NC))* )
""", re.IGNORECASE | re.VERBOSE)
for match in ruu.findall(inputtext):
print match
print '----------- eyquem 2 ------------'
rii = re.compile('[_-]'
'(\d{4}[A-Z]{0,3})'
'[_-]{1,3}'
'('
'(?=\d{2,4}[A-Z]{0,3}(?![\dA-Z]))'
'(?:[0-9A-Z_-]+?)'
')'
'(?:[-_]+NC.*)?'
'(?![0-9A-Z_-])',
re.IGNORECASE)
for m in rii.findall(inputtext):
print m
結果
----------- Martijn 2 ------------
('1234', '0040_rev_2_1')
('1122Ae', '1150_rev2_1')
('0124e', '50')
('0228e', '66-_')
('1980', '2234a_2')
('2999', '133a')
('5098', '2270_2_1')
('6099', '33370_2_1')
('6099', '3370abcd_2_1')
('7659Ae', '1450sp_rev_2_1')
('7659Ae', '1450sp_rev_2_1__')
('7659Ae', '1450sp_rev_2_1')
('7659Ae', '1450sp_rev_2_1_')
('7659Ae', '1450sp_rev_2_1_a')
----------- eyquem 2 ------------
('1234', '0040_rev_2_1')
('1122Ae', '1150_rev2_1')
('0124e', '50')
('0228e', '66')
('1980', '2234a_2')
('2999', '133a')
('5098', '2270_2_1')
('7659Ae', '1450sp_rev_2_1')
('7659Ae', '1450sp_rev_2_1')
('7659Ae', '1450sp_rev_2_1')
('7659Ae', '1450sp_rev_2_1_anc_woof')
('7659Ae', '1450sp_rev_2_1_abNC_woof')
備考:
私の正規表現は「33370_2_1」も「3370abcd_2_1」もキャッチしません。これは、「2〜4文字の後に最大3桁が続く可能性がある」というパターンを尊重しないためです。Martijn
のソリューションはそれらをキャッチします
私の正規表現によってキャッチされた部分の端はきれいです。Martijn のコードではそうではありません
Martijn の正規表現は、すべてのシーケンス NC または nc の前で停止します。アンダースコアが前になくても、つまり、これらのシーケンスが必要な部分の一部である文字であってもです。
私の正規表現のこの特性が望ましくない場合は、私に言ってください、私はそれを変更します