2011-12-20 130 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),使用

(?>=\>)(.*?)(?=/) 
相關問題