我尝试使用一个非捕获组来检测空格(在我需要的数字之前),而不是在结果中加入空格,所以我使用
(?: 1 +)\ d *。?\ d *
处理我的文字:
input: kMPCV/epS4SgFoNdLo3LOuClO/URXS/5 134.686356921 2018-06-14 21:50:35.494
input: pRVh7kPpFbtmuwS1NILiCzwHUVwJ4NcK 839.680408921 2018-06-14 22:13:39.996
input: Ga7MIXmXAsrbaEc1Yj60qYYblcRQpnpz 4859.688276920 2018-06-14 23:02:11.125
input: 4mqdb5njytfDOFpgeG3XS0Iv1OXFPEnb 1400.684675920 2018-06-14 23:33:42.031
并尝试获取数字。
但是第2行和第3行返回无结果,第1行和第4行返回前有1个空格的数字:“ 134.686356921”
为什么我得到不同的结果?代码如下:
import re
def calcprice(filename):
try:
print ('ok')
f = open(filename, 'r')
data = f.read()
rows = data.split('\n')
for row in rows:
print (re.search("[(?: 1+)\d*\.?\d*][1]",row))
except Exception as e:
print(e)
if __name__ == "__main__": ## If we are not importing this:
calcprice('dfk balance.txt')
结果:
<_ sre.SRE_Match对象; span =(52,66),match ='134.686356921'>
没有
没有
<_ sre.SRE_Match对象; span =(51,66),match ='1400.684675920'>
答案 0 :(得分:0)
您当前的正则表达式基本上是一个大字符集:
[(?: 1+)\d*\.?\d*]
没什么意义,似乎对正则表达式的工作方式有误解。如果您想匹配数字,那么往后看几个空格,匹配数字和句点,然后再看另外两个空格可能更有意义:
(?<= )[\d.]+(?= )
https://regex101.com/r/NRnXWb/1
for row in rows:
print (re.search(r"(?<= )[\d.]+(?= )",row))
答案 1 :(得分:0)
您的正则表达式[(?: 1+)\d*\.?\d*][1]
是character class的2倍。
如果要匹配的数字始终包含一个点,则可以使用word boundary和正数lookahead来断言其后是空白:
如果它也可以不带点,则可以使用lookrounds来检查前导空格和尾随空格,并使与点和一个或多个数字匹配的部分为可选(?:\.\d+)?
。
答案 2 :(得分:0)
尝试使用正则表达式\b(\d+[\d\.]*)\b
您的正则表达式与您要执行的操作不一致。这是非常错误的。
答案 3 :(得分:0)
尝试以下模式:+(\d+(\.\d+)?) +
。
说明:模式将匹配前面的数字,后跟一个或多个空格(+
)。它将匹配具有可选小数部分((\.\d+)?
)的数字,这将成为匹配项中的第二个捕获组(但是无论如何您都不需要它)。
在每次比赛中,第一个捕获组\1
将是您的电话号码。