Python 一些正则表达式的东西

Python 一些正则表达式的东西,python,regex,Python,Regex,我刚刚开始理解正则表达式,希望能得到一些帮助来理解它。我一直在用它来帮助我开始,但我仍然有一些困难弄清楚它 我想做的是把这段文字: <td>8.54/10 over 190 reviews</td> 8.54/10超过190条评论 然后拉出“8.54”,基本上是第一个“>”和“/”之间的任何内容 利用我的noob技能,我想出了这个:[0-9].[0-9][0-9],它将与8.54相匹配,并且将适用于除10.00以外的所有情况,我确实需要说明这一点 有谁能帮我改进一下表

我刚刚开始理解正则表达式,希望能得到一些帮助来理解它。我一直在用它来帮助我开始,但我仍然有一些困难弄清楚它

我想做的是把这段文字:

<td>8.54/10 over 190 reviews</td>
8.54/10超过190条评论
然后拉出“8.54”,基本上是第一个“>”和“/”之间的任何内容

利用我的noob技能,我想出了这个:[0-9].[0-9][0-9],它将与8.54相匹配,并且将适用于除10.00以外的所有情况,我确实需要说明这一点


有谁能帮我改进一下表达,使之也适用于最后一种情况吗?

也许回答了我自己的问题。我们发现:

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


这似乎有效,有人对此有任何更改吗?

可能回答了我自己的问题。我们发现:

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

这似乎有效,有人对此有任何更改吗?

使用量词

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

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

\d+\.\d+
现在,注意量词只适用于原子。字符类(
[…]
)、补充字符类(
[^…]
)和特殊字符类(
\d
\w
)都是原子,但是如果要对多个简单的原子应用量词,则需要使用分组运算符
()
对这些原子进行分组。例如,
(ab)+
将查找一个或多个
ab

使用量词

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

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

\d+\.\d+

现在,注意量词只适用于原子。字符类(
[…]
)、补充字符类(
[^…]
)和特殊字符类(
\d
\w
)都是原子,但是如果要对多个简单的原子应用量词,则需要使用分组运算符
()
对这些原子进行分组。也就是说,
(ab)+
将查找一个或多个
ab

\d
经常被用来代替
[0-9]
(从助记符的角度来说,是“数字”),并且需要记住,有时小数点前没有任何数字。因此:

(?<=>)(?:\d+(?:\.\d*)?|\.\d+)(?=/)
(?)(?:\d+(?:\。\d*)?\。\d+(=/)
好的,这有点复杂。下面是它的分解方式(扩展形式)

(?)#前面带“>”(但不匹配)…
(?:#…匹配以下任一项
\d+#至少一位数字,后跟…
(?:#…匹配
\.\d*#后跟任意数字的点
)?#可选
|#……还是这个
\.\d+#后跟至少一个数字的点
)                 #
(?=/)#…之后加上“/”(但不匹配)

\d
通常用来代替
[0-9]
(从助记符的角度来说,是“数字”),需要记住的是,有时小数点前没有任何数字。因此:

(?<=>)(?:\d+(?:\.\d*)?|\.\d+)(?=/)
(?)(?:\d+(?:\。\d*)?\。\d+(=/)
好的,这有点复杂。下面是它的分解方式(扩展形式)

(?)#前面带“>”(但不匹配)…
(?:#…匹配以下任一项
\d+#至少一位数字,后跟…
(?:#…匹配
\.\d*#后跟任意数字的点
)?#可选
|#……还是这个
\.\d+#后跟至少一个数字的点
)                 #
(?=/)#…之后加上“/”(但不匹配)
这可能有效:

\>(.*?)/

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

m.group(1)
其中m是re.search或re.finditer返回的匹配对象

如果要直接访问该值(re.findall),请使用

这可能会奏效:

\>(.*?)/

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

m.group(1)
其中m是re.search或re.finditer返回的匹配对象

如果要直接访问该值(re.findall),请使用


它不起作用,因为您使用的是
*
量词,意思是“零或更多”,因此这将匹配,例如
12。
。还有,我想你错过了那之后的期末考试,对吧?否则,非捕获组(
(?:…)
)就没有意义了。也可以看到我关于点的答案。这会起作用,但它也会接受一个在点后面没有数字的字符串,这可能是你想要的,也可能不是。另外,
[0-9]
可以更简洁地写成
\d
。它不起作用,因为您使用了
*
量词,它意味着“零或更多”,因此这将匹配,例如,
12。
。还有,我想你错过了那之后的期末考试,对吧?否则,非捕获组(
(?:…)
)就没有意义了。也可以看到我关于点的答案。这会起作用,但它也会接受一个在点后面没有数字的字符串,这可能是你想要的,也可能不是。另外,
[0-9]
可以更简洁地写成
\d
。如果你真的在寻找“基本上在第一个“>”和“/”之间的任何东西”,那么你应该使用:
re.search('\>(.*)/',text)。如果你真的在寻找“基本上在第一个“>”和“/”之间的任何东西,那么组(1)
,然后应该使用:
re.search('\>(.*?/),text.group(1)
没问题。谷歌“掌握正则表达式”并购买boo