正则表达式:提取HTML标签内无空格换行的带分隔符数值
解决标签内数值提取的正则问题
看来你卡在提取带冗余空白的数值上了,我来帮你捋捋问题出在哪,再给你靠谱的解决方案:
首先得说下你之前用的正则为啥不好用:
<span class="value">(.*)</span>:这个用了贪婪匹配,会把标签里的所有内容(包括前后的28个空格、换行符)全抓进来,拿到的不是纯数值;<span="value">[^\s-]</span>:首先语法就错了(少了class=),而且[^\s-]只能匹配单个非空格、非横杠的字符,根本拿不到完整的数值串。
针对你的需求(唯一标签、数值含逗号/点、前后有大量空白),给你两个实用方案:
方案1:精准匹配数值格式
如果确定数值只由数字、逗号、点组成,用这个正则直接捕获纯数值:
<span class="value">\s*([\d.,]+)\s*</span>
\s*:匹配任意数量的空白(空格、换行、制表符都算),跳过前后的冗余空白;[\d.,]+:匹配1个及以上的数字、逗号或点,正好覆盖你提到的1、0,123、123.456,78这些格式;- 括号里的内容就是你要的纯数值。
比如用Python测试:
import re html = '<span class="value">\n 123.456,78 </span>' match = re.search(r'<span class="value">\s*([\d.,]+)\s*</span>', html) print(match.group(1)) # 输出 123.456,78
方案2:先抓内容再清空白
如果数值格式可能有其他变化(比如偶尔带特殊符号),先捕获标签内的全部内容,再用strip()去掉前后空白更灵活:
<span class="value">(.*?)</span>
.*?是非贪婪匹配,只会抓当前标签内的内容(不会越界,虽然你说只有一个标签,但这样更安全);- 拿到内容后调用字符串的
strip()方法,一键清除前后所有空白和换行。
示例代码:
import re html = '<span class="value"> 0,0126 </span>' match = re.search(r'<span class="value">(.*?)</span>', html) if match: clean_value = match.group(1).strip() print(clean_value) # 输出 0,0126
这两个方案都能完美解决你的问题,选哪个看你对数值格式的确定性~
内容的提问来源于stack exchange,提问作者Evgeniy
相关产品推荐
相关产品推荐

