2010-04-13 66 views
0

我需要在Python中使用正则表达式提取字符串的部分。Python中的正则表达式问题

我用基本的正则表达式很好,但是我看起来很糟糕。我已经在下面显示了两个示例记录。最后一个大块始终是一个货币字段,例如在第一个是4,76。在第二个是2,00。第二个帐户号码是\ d {6} - \ d {6}的模式。之后的任何事情都是货币。

24.02 24.02VALINTATALO MEGAHERTSI4,76- 
24.02 24.02DOE MRIDANG 157235-1234582,00- 

你能帮我解决这个正则表达式吗?下面给出了我所写的内容,但它将帐号中的“短划线”之后的所有内容都视为货币。

.*?(\d\d\.\d\d)(.*?)\s*(?<!\d{6}-\d{6})(\d*,\d\d) 

在此先感谢

+0

所以你想提取最后一个数字(货币),但它可以由一个帐号前缀?这是问题吗? – compie 2010-04-13 19:11:32

+0

是的,请。我想我需要使用一种环顾四周。谢谢。 – 2010-04-13 19:13:47

回答

1
import re 

def extract_current(s): 
    s = s[s.rfind(' ')+1:-1] 
    s = re.sub('\d{6}-\d{6}', '', s) 
    s = re.sub('[A-Z]+', '', s) 
    return s 

print extract_current('24.02 24.02VALINTATALO MEGAHERTSI4,76-') 
print extract_current('24.02 24.02DOE MRIDANG 157235-1234582,00-') 

输出:

4,76 
2,00 
0
(?<=\b\d{6}-\d{6}|[^-\d])\d+?,\d\d 

将匹配 “货币” 是要么通过帐号或其他任何东西之前(除了一个连字符)。这足够吗?

0
(?<=\d{6}-\d{6}|[A-Z ])[0-9,]+(?=-$) 

此正则表达式的由任一帐号或字母或空间前面的数字和逗号第一字符串相匹配,并具有后破折号其为线/字符串的最后一个字符。

1

这似乎工作:

.*?(\d\d\.\d\d)(.*?)(?:\d{6}-\d{6})?(\d*,\d\d) 

说明:(?:\ d {6} - \ d {6})看到账号,但不记得了。它后面的问号允许帐号不在。我们不想记住帐号的原因是它抛出了我们通过match.group(3)访问的索引。即,如果帐号存在,它可能在索引4。

+0

+1。另外,我知道OP使用了最初的'。*?',但是如果使用'.search'方法而不是'.match',我相信它可以被删除。 – tzot 2010-04-13 22:24:00