Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式用于从tweet中获取数字分数,该分数可能与“quot;”一起出现&引用;“之前”/&引用;签字,然后签字_Python_Regex_String - Fatal编程技术网

Python 正则表达式用于从tweet中获取数字分数,该分数可能与“quot;”一起出现&引用;“之前”/&引用;签字,然后签字

Python 正则表达式用于从tweet中获取数字分数,该分数可能与“quot;”一起出现&引用;“之前”/&引用;签字,然后签字,python,regex,string,Python,Regex,String,我很难在每一条推文上都出现“/”之前获得数字分数的第一部分,如下所示。 问题是,有时分数包含像“13.5”这样的小数,或者可能有一个写为9/11的日期,我不需要。因此,在结尾我需要两列:第一列在“/”符号之前提取分数的第一部分(分子),第二列在“/”符号之后有一个分母,通常它应该总是10。在链接的末尾可能也有一些我不想要的数字 在第一个新列中,我只想获取粗体部分,在第二列中获取“/10”部分: 我是贝拉。她希望她的微笑能让你微笑。如果没有,她也会给你她最喜欢的猴子13.5/10 RT@dog_r

我很难在每一条推文上都出现“/”之前获得数字分数的第一部分,如下所示。 问题是,有时分数包含像“13.5”这样的小数,或者可能有一个写为9/11的日期,我不需要。因此,在结尾我需要两列:第一列在“/”符号之前提取分数的第一部分(分子),第二列在“/”符号之后有一个分母,通常它应该总是10。在链接的末尾可能也有一些我不想要的数字

在第一个新列中,我只想获取粗体部分,在第二列中获取“/10”部分:

我是贝拉。她希望她的微笑能让你微笑。如果没有,她也会给你她最喜欢的猴子13.5/10

RT@dog_rates:经过这么多请求,我是Bretagne。她是最后一只幸存的911搜救犬,也是我们第二只幸存的搜救犬。撕开

这里我们有一个1949年的第一代vulpix。享受汗水茶和福克斯新闻。不能分阶段进行。5/10

这是一只西部棕色三菱梗。对叶感到不安。实际上这里有两只狗。7/10会让你走得更远

我试着按如下方式做:

import re
test = re.findall("[0-9]+.\d", "score 13/10") 

print(test)
['13/1']
对于下面的情况,它是有效的

import re
test = re.findall("[0-9]+.\d", "score 13.5/10") 
print(test)
['13.5']
有没有一种很好的方法可以利用python中的正则表达式来做这样的事情?
提前感谢您的帮助。

您可以匹配并捕获后跟任意数量的非数字字符的两个值,直到
http
字符串:

(?P\d+(?:\。\d+)/(?P\d+(?:\。\d+)?(=\d*http)
看。详情:

  • (?P\d+(?:\。\d+)
    -组“val1”:一个或多个数字,后跟可选的
    序列和一个或多个数字
  • /
    -a
    /
    字符
  • (?P\d+(?:\。\d+)
    -组“val2”:一个或多个数字,后跟一个可选的
    序列和一个或多个数字
  • (?=\D*http)
    -一种正向前瞻,需要尽可能多的任何零个或多个非数字字符,然后紧靠当前位置右侧的
    http
见:

重新导入
text='我是贝拉。她希望她的微笑能让你微笑。如果没有,她也会给你她最喜欢的猴子。13.5/10 https://twitter.com/dog_rates/status/883482846933004288'
m=重新搜索(r'(?P\d+(?:\。\d+)/(?P\d+(?:\。\d+)?(=\d*http)),文本)
如果m:
打印(m.groupdict())
#=>{'val1':'13.5','val2':'10'}

非常感谢Wiktor,不过我还是不太清楚。我的正则表达式不够熟练。你能把它分成两个单独的函数吗?我可以用两个单独的步骤来应用它吗?@Rafal,你是什么意思?这里只有一步,没有什么可分割的。使用
match=m.groupdict()
然后可以使用
match[“val1”]
match[“val2”]
访问值。好了,现在我知道了如何实现它。然而,regex语法并不是在所有情况下都有效。对不起,这是我的错,因为我没有提供所有例外情况。我已经在上面更新并添加了另外两个可能的tweet内容,但不确定regex是否能够处理这些内容。@RafałPietrak It。看,一切正常。谢谢你@Wiktor