1

以下を正規表現と一致させる方法は?

string1 = '1.0) The Ugly Duckling (TUD) (10 Dollars)'
string2 = '1.0) Little 1 Red Riding Hood (9.50 Dollars)'

私は次のことを試みています:

groupsofmatches = re.match('(?P<booknumber>.*)\)([ \t]+)?(?P<item>.*)(\(.*\))?\(.*?((\d+)?(\.\d+)?).*([ \t]+)?Dollars(\))?', string1)

問題は、string2に適用すると正常に機能することですが、式をstring1に適用すると、「(TUD)」部分のために「m.group(name)」を取得できません。両方の文字列で機能する単一の式を使用したいと思います。

私が期待する:

booknumber = 1.0
item = The Ugly Duckling (TUD)
4

5 に答える 5

0

繰り返される文字に、より厳しい制限を課すことができます。

groupsofmatches = re.match('([^)]*)\)[ \t]*(?P<item>.*)\([^)]*?(?P<dollaramount>(?:\d+)?(?:\.\d+)?)[^)]*\)$', string1)

これにより、番号が最後の括弧のセットから取得されるようになります。

于 2012-10-29T23:26:42.533 に答える
0

私はそれを次のように書きます:

num, name, value = re.match(r'(.+?)\) (.*?) \(([\d.]+) Dollars\)', s2).groups()
于 2012-10-29T23:28:00.263 に答える
0

あなたの問題はそれが.*貪欲に一致することであり、それは文字列の多くを消費している可能性があります。すべての一致グループを印刷すると、これがより明確になります。

import re

string1 = '1.0) The Ugly Duckling (TUD) (10 Dollars)'
string2 = '1.0) Little 1 Red Riding Hood (9.50 Dollars)'

result = re.match(r'(.*?)\)([ \t]+)?(?P<item>.*)\(.*?(?P<dollaramount>(\d+)?(\.\d+)?).*([ \t]+)?Dollars(\))?', string1)

print repr(result.groups())
print result.group('item')
print result.group('dollaramount')

*?一致が最小になるように変更します

これは一部のREエンジンでは高額になる可能性があるため、たとえば\([^)]*\)すべての括弧に一致するように記述することもできます。大量のテキストを処理していない場合は、おそらく問題ではありません。

r'something'ところで、驚くべきバックスラッシュの振る舞いを避け、読者に手がかりを与えるために、正規表現には実際に生の文字列(つまり)を使用する必要があります。

(\(.*?\))?おそらく切り取っていたこのグループ(TUD)があったようですが、実際にタイトルにそれが必要な場合は、削除してください。

于 2012-10-29T23:28:00.870 に答える
0

これは私がデモでそれを行う方法です

(?P<booknumber>\d+(?:\.\d+)?)\)\s+(?P<item>.*?)\s+\(\d+(?:\.\d+)?\s+Dollars\)

于 2012-10-29T23:29:31.640 に答える
0

正規表現パターンを使用することをお勧めします

(?P<booknumber>[^)]*)\)\s+(?P<item>.*\S)\s+\((?!.*\()(?P<amount>\S+)\s+Dollars?\)
于 2012-10-29T23:49:24.093 に答える