Python 使用正则表达式在特定单词之前提取数字

Python 使用正则表达式在特定单词之前提取数字,python,pandas,re,Python,Pandas,Re,目标 提取单词hours、hour、day或days之前的数字 如何使用|匹配单词? 返回 ['5.1', '100', '1'] 因为100和1不在确切的单词hours之前,所以它们不应该出现。期望 5.1 如何从匹配结果中提取第一个数字 s1='2约10.2+/-30小时' 关于findallr[\d.+-/]+\s*小时|\s*小时,s 返回 ['5.1', '100', '1'] ['10.2 +/- 30'] 期待 10.2 请注意,特殊字符+/-。是可选的。什么时候出现如1.

目标

提取单词hours、hour、day或days之前的数字

如何使用|匹配单词? 返回

['5.1', '100', '1']
因为100和1不在确切的单词hours之前,所以它们不应该出现。期望

5.1
如何从匹配结果中提取第一个数字 s1='2约10.2+/-30小时' 关于findallr[\d.+-/]+\s*小时|\s*小时,s 返回

['5.1', '100', '1']
['10.2 +/- 30'] 期待

10.2
请注意,特殊字符+/-。是可选的。什么时候出现如1.3,1.3将需要显示为。。但是当1+/-0.5发生时,需要提取1,并且不应提取+/-中的任何一个

我知道我可能会做一个分裂,然后采取第一个数字

str(re.findall(r"([\d. +-/]+)\s*hours", s1)[0]).split(" ")[1]
给予

但有些结果只返回一个数字,因此拆分将导致错误。我应该用另一个步骤还是一个步骤

请注意,这些字符串s1、s2是数据帧中的值。因此,需要使用apply和lambda等函数进行迭代。

事实上,我会在这里使用re.findall:

单位=[小时,小时,天,天]这里的顺序很重要:把复数放在第一位 正则表达式=r'?:'+'|'.joinunits+r s='2约5.1小时100天1秒' values=re.findallr'\b\d+?:\。\d+?\s+'+regex,s printvalues打印['5.1'] 如果您还想捕获正在使用的单位,则进行单位交替捕获,即使用:

regex = r'(' + '|'.join(units) + r')'
那么输出将是:

[('5.1', 'hours')]
事实上,我会在这里使用re.findall:

单位=[小时,小时,天,天]这里的顺序很重要:把复数放在第一位 正则表达式=r'?:'+'|'.joinunits+r s='2约5.1小时100天1秒' values=re.findallr'\b\d+?:\。\d+?\s+'+regex,s printvalues打印['5.1'] 如果您还想捕获正在使用的单位,则进行单位交替捕获,即使用:

regex = r'(' + '|'.join(units) + r')'
那么输出将是:

[('5.1', 'hours')]
代码

测验

解释

上面使用的便利性是,原始字符串r'…'和字符串插值f'…'可以组合为:

fr'...'

案例字符串:

fr'({number})(?:[\s\d\-\+\/]*)(?:{units})'
零件顺序如下:

fr'{number}'-捕获组'\d+[,]?\d*'用于整数或浮点 r'?:[\s\d-+/]*'-数字和单位之间允许字符的非捕获组,即空格、+、-、数字、/ fr'?:{units}'-单元的非捕获组 代码

测验

解释

上面使用的便利性是,原始字符串r'…'和字符串插值f'…'可以组合为:

fr'...'

案例字符串:

fr'({number})(?:[\s\d\-\+\/]*)(?:{units})'
零件顺序如下:

fr'{number}'-捕获组'\d+[,]?\d*'用于整数或浮点 r'?:[\s\d-+/]*'-数字和单位之间允许字符的非捕获组,即空格、+、-、数字、/ fr'?:{units}'-单元的非捕获组
你能解释一下fr做什么和做什么吗?:在代码cases=fr'{number}?:{case1}{case2}'中做什么吗?非常感谢您的时间。@June添加了一个注释,其中提到了原始f字符串,即原始插值字符串。字符串插值很简单:x=5;s=f'{x}'创建一个字符串s='5',即字符串插值允许在字符串中替换变量。感谢您的回复!我发现了另一个关于代码的问题。如果我们有一个字符串s='西妥昔单抗的平均半衰期为114小时,范围为75-188小时。'然后执行pattern.findallstrs将给出结果['114','75-188']。我觉得这很奇怪,因为案例似乎应该只取第一个单位值,因为它是a |。我理解得不对吗?有没有办法去掉数字前的空格,只取114作为结果。@June做了一个更新,应该可以提供更好的结果。@June添加了一个“风湿性关节炎患者102+/-30小时,健康成年人68小时”的修复程序。结果是['102','68']。在这种情况下,这两个数字都是期望的结果吗?你介意解释fr做什么和做什么吗?:在代码cases=fr'{number}?:{case1}{case2}'中做什么吗?非常感谢您的时间。@June添加了一个注释,其中提到了原始f字符串,即原始插值字符串。字符串插值很简单:x=5;s=f'{x}'创建一个字符串s='5',即字符串插值允许在字符串中替换变量。感谢您的回复!我发现了另一个关于代码的问题。如果我们有一个字符串s='西妥昔单抗的平均半衰期为114小时,范围为75-188小时。'然后执行pattern.findallstrs将给出结果['114','75-188']。我觉得这很奇怪,因为案例似乎应该只取第一个单位值,因为它是a |。我理解得不对吗?有没有办法去掉数字前的空格,只取114作为结果。@June做了一个更新,应该可以提供更好的结果。@June添加了一个“风湿性关节炎患者102+/-30小时,健康成年人68小时”的修复程序。结果是['102','68']。这两样都有吗 在这种情况下,为所需结果编号?