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

我建议你使用正则表达式模式

(?P<booknumber>[^)]*)\)\s+(?P<item>.*\S)\s+\((?!.*\()(?P<amount>\S+)\s+Dollars?\)
于 2012-10-29T23:49:24.093 回答
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 引擎中可能很昂贵,因此您也可以编写 eg\([^)]*\)来匹配所有括号。如果您不处理大量文本,则可能无关紧要。

顺便说一句,您应该真正使用原始字符串(即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 回答