Python 2.xで正規表現を使用して、略語のサブセットをキャプチャする作業を行っています。そのような略語のいくつかは、次のテキストに表示されます。
# text # desired capture
The certolizumab pegol (Cmzia, CZP)... 'CZP'
The drug 6-mercatopureine (6-mp) ... '6-mp'
The merits of 5-Asasdfdsf (5-ASA) ... '5-ASA'
CZP
最初の例では、結果を取り戻し、を無視することに関心がありCmzia,
ます。
これが私が持っていた以前の正規表現です。これは、とのようなケースを照合するために必要(6-mp)
です(5-ASA)
。
\((\S*[A-Z-0-9]\S*)\) # captures '6-mp' and '5-ASA', respectively
上記のケースを処理するために私が行った追加は次のとおりです。
\S*\s+[A-Z-0-9]+ # I only want to capture the '[A-Z-0-9]+'
次の正規表現を使用してみました(コンテキストと混同されないように、関心のある部分を太字にしようとしましたが、うまくいかなかったようです)。
# in p1, I add the pattern to the list, separated by '|'
>>> p1 = re.compile(r'\((\S*[A-Z-0-9]\S*|\S*\s+[A-Z-0-9]+)\)')
>>> p1.findall('The certolizumab pegol (Cmzia, CZP)')
['Cmzia, CZP']
# in p2, I use a broad non-capturing group, enclosing the desired captured expressions in parentheses
>>> p2 = re.compile(r'\((?:(\S*[A-Z-0-9]\S*)|\S*\s+([A-Z-0-9]+))\)')
>>> p2.findall('The certolizumab pegol (Cmzia, CZP)')
[('', '', 'CZP')]
# this is an addition to the original post
# demonstrates that the non-capturing expression doesn't prevent capture of the section \S*\s+
>>> p3 = re.compile(r'\((\S*[A-Z-0-9]\S*|(?:\S*\s+)[A-Z-0-9]+)\)')
>>> p3.findall('The certolizumab pegol (Cmzia, CZP)')
['Cmzia, CZP']
理想的には、出力が必要ですCZP
。に対応するものを除外したいので、p1はあまりにも多くを返します。p2に関しては、目的の出力に一致するように出力を簡単に操作できることはわかっていますが、それを処理するように正規表現を変更する方法があるかどうかを知りたいと思います。\S*\s+
Cmzia,
ありがとう、そしてあなたが追加の詳細/説明が必要な場合は私に知らせてください。
編集:
私はまだ正規表現が正規表現の最初の/元の部分から6-mp
とをキャプチャすることを望んでいます。5-ASA
編集2:
これは上に含まれていますが、1つの場所に置いて、私の質問を要約します。
pattern = r'???'
p = re.compile(pattern)
p.findall('Stuff stuff (Cmzia, CZP) stuff stuff (5-ASA) (6-mp) stuff...')
['CZP','5-ASA','6-mp']