2011-12-20 101 views
1

我刚开始弄清正则表达式,并希望能够帮助理解它。我一直在使用this来帮助我开始,但我仍然有一些麻烦找出来。一些正则表达式的东西

我所试图做的是采取这样的文字:

<td>8.54/10 over 190 reviews</td> 

,并拉出了“8.54”,所以基本上在第一之间的任何东西“>”和“/”

使用我的noob技巧,我想出了这个:[0-9]。[0-9] [0-9],这将匹配8.54,并将工作的一切,但10.00,我需要考虑。

任何人都可以帮助我优化我的表达以适用于最后一种情况吗?

+0

如果你真的寻找“第一之间基本上什么‘>’和‘/’”,那么你应该使用:'re.search('\>(* ?)/',text).group(1)' – jcollado 2011-12-20 15:29:23

回答

8

使用量词。

您需要一个或多个数字,后跟一个点,后跟一个或多个数字。一个数字也可以写成\d,并且“一个或多个”量词是+

该点需要转义,因为它是一个正则表达式元字符,意思是“任何字符”。因此,您的正则表达式应该是:

\d+\.\d+ 

现在,请注意,量词仅适用于原子。字符类([...]),补充字符类([^...])和特殊字符类(\d\w ...)是原子,但是如果你想要一个量词申请不是简单的原子多,你需要这些原子使用分组运算符()。即,(ab)+将寻找一个或多个ab

+0

工程。谢谢!将允许我尽快接受。 – tnw 2011-12-20 15:23:17

+0

没问题。谷歌“掌握正则表达式”并购买这本书,这是一笔很棒的投资;) – fge 2011-12-20 16:50:40

2

也许回答了我自己的问题。发现这一点:

[0-9] +(?:[0-9] *)

看来工作,没有任何人有这个什么变化?

+0

由于您使用'*'量词,意思是“零个或多个”,所以它将不起作用,因此它会匹配例如'12.'。另外,我想你在那之后错过了最后的'?',对吧?否则,非捕获组('(?:...)')实际上并不合理。并且看到我对这个点的回答。 – fge 2011-12-20 15:18:02

+0

这会起作用,但它也会接受一个没有数字的字符串,可能是或不是你想要的。另外,'[0-9]'可以更紧凑地写为'\ d'。 – 9000 2011-12-20 15:20:33

0

\d经常被用来代替[0-9](mnemonically,“d igit”),并要记住,有时小数在没有小数点前的任何数字写有必要。因此:

(?<=>)(?:\d+(?:\.\d*)?|\.\d+)(?=/) 

好的,这是一个复杂的RE。这是它如何分解(扩展形式)。

​​
0

这可能会实现:

\>(.*?)/ 

# (.*?) is a "non-greedy" group which maches as few characters as possible 

然后访问使用实际值

m.group(1) 

其中M是re.search或re.finditer

返回的匹配对象如果您想直接访问该值(重新编号)。的findall),使用

(?>=\>)(.*?)(?=/) 
相关问题