2011-12-20 4 views
1

Я только начинаю вычислять регулярное выражение и хотел бы помочь, пытаясь понять его. Я использовал this, чтобы помочь мне начать работу, но у меня все еще есть проблемы с этим.Некоторые вещи Regex

То, что я пытаюсь сделать, это принять этот текст:

<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

ответ

8

Использование кванторов.

Вам нужна одна или несколько цифр, за которой следует точка, а затем одна или несколько цифр. Цифра также может быть записана \d, а «один или несколько» квантификаторов - +.

Точка должна быть экранирована, поскольку это метасимвол регулярного выражения, что означает «любой символ». Поэтому ваше регулярное выражение должно быть:

\d+\.\d+ 

Теперь остерегайтесь того, что квантор применяется только к атомам. Классы символов ([...]), дополненные классы символов ([^...]) и специальные классы символов (\d, \w ...) являются атомами, однако, если вы хотите применить квантификатор к более чем простому атому, вам понадобится группа эти атомы используют оператор группировки, (). Т.е., (ab)+ будет искать один или несколько из ab.

+0

Работы. Спасибо! Скоро примут, как это позволяет. – tnw

+0

Нет проблем. Google для «освоения регулярных выражений» и покупки книги, это отличная инвестиция;) – fge

2

Возможно, ответили на мой вопрос. Нашел:

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

Это похоже на работу, есть ли какие-либо изменения в этом?

+0

Это не сработает, так как вы используете квант' * ', что означает« ноль или больше », поэтому это будет соответствовать, например,' 12.'. Кроме того, я думаю, что вы пропустили окончательный '?' После этого, верно? В противном случае группа без захвата ('(?: ...)') на самом деле не имеет смысла. А также см. Мой ответ о точке. – fge

+0

Это будет работать, но оно также примет строку без цифр после точки, что может быть или не быть тем, что вы хотите. Кроме того, '[0-9]' можно записать более компактно как '\ d'. – 9000

0

\d часто используется вместо [0-9] (мнемонический, «d ИГИТА»), и это необходимо помнить, что иногда дробные числа записываются без каких-либо цифр перед десятичной точкой. Таким образом:

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

ОК, это немного сложный RE. Вот как он ломается (в расширенной форме).

(?<= >)   # With a “>” before (but not matched)… 
(?:    # … match either this 
    \d+   # at least one digit, followed by… 
    (?:   # …match 
     \. \d*  #  a dot followed by any number of digits 
    ) ?   # optionally 
|     # … or this 
    \. \d+   # a dot followed by at least one digit 
)     # 
(?= /)   # … and with a “/” afterwards (but not matched) 
0

Это может работать:

\>(.*?)/ 

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

Затем доступ к реальному значению, используя

m.group(1) 

где т объект матч возвращаемый re.search или re.finditer

Если вы хотите получить доступ к значению напрямую (см.FindAll), используйте

(?>=\>)(.*?)(?=/) 
Смежные вопросы