首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数字和字符串之间的正则表达式

数字和字符串之间的正则表达式
EN

Stack Overflow用户
提问于 2022-09-17 23:53:12
回答 4查看 104关注 0票数 1

我试图提取所有参考教学经验的数字,应该是8,17,7。我试过了(years.*?teaching.*?:.*?[0-9]+|\d+.+teaching),但是由于第二个条件,它从第一个数字中获取了所有的东西。

样本文本:

10+年小企业所有权,10+年中小企业咨询,10+年企业/职业商业培训,8年教学经验,教学经验:17年,7+年教学/企业培训经验

EN

回答 4

Stack Overflow用户

发布于 2022-09-18 00:14:26

保持正则表达式的原样,以一种不同的方式来处理它是很好的。我宁愿把东西拆开,然后用较小的字符串来代替正则表达式。

代码语言:javascript
运行
复制
import re

input = '10+ years small business ownership, 10+ years sme consulting, 10+ years corporate/vocational business training, 8 years teaching experience, years of teaching experience: 17, 7+ years teaching/Corporate Training experience'

regex = re.compile('(years.*?teaching.*?:.*?[0-9]+|\d+.+teaching)');

lines = input.split(',')
filteredLines = filter(lambda line: 'teaching' in line, lines)
experiences = map(lambda line: regex.match(line.strip()).group(), filteredLines);

print(list(experiences))

您可以进一步修改它以满足您的需要。

票数 2
EN

Stack Overflow用户

发布于 2022-09-18 01:00:19

假设如下:

  • 每个逗号分隔的子字符串不包含一个以上的数字。
  • teaching总是与分隔子串中的经验数年相关。

卢卡哈德一起使用的想法(用于与re.findall一起使用,re.I 标志用于忽略情况)

代码语言:javascript
运行
复制
re.findall(r"(?:,|^)(?=[^,]*?teaching)[^\d,]*(\d+\+?)", s, flags=re.I)
  • (?:,|^)起点要么是字符串的^开始,要么是逗号。
  • (?=[^,]*?teaching) 条件检查teaching是否发生在下一次 ,
  • 关于成功,[^\d,]*(\d+\+?)俘获,number和可选 + to first group

请参阅这个在regex101的演示 (右侧更多信息)或tio.run的Python演示

票数 2
EN

Stack Overflow用户

发布于 2022-09-18 14:32:26

在@bobble的鼓励下,我提出了这个准则(在bobble泡的评论之后修饰):

代码语言:javascript
运行
复制
([0-9]+).{1,15}teaching|teaching.{1,15}?([0-9]+)

鉴于“教学”与“教学年限”的接近程度,这一准则将比赛分为两部分:

  1. “教学”是在一年之后,但在近距离(任何字符在1到15个位置)。
  2. “教学”第一;注意.{1,15}?;?最后是不贪婪,否则它也会匹配“经验: 17”中的"1“。

缺点是它会产生两组。您可以使用python摆脱它,如下所示:

代码语言:javascript
运行
复制
import re

s = "10+ years small business ownership, 10+ years sme consulting, 10+ years corporate/vocational business training, 8 years teaching experience, years of teaching experience: 17, 7+ years teaching/Corporate Training experience"

matches = re.findall(r"([0-9]+).{1,15}teaching|teaching.{1,15}?([0-9]+)", s)

matches = [int(x) if x != '' else int(y) for (x, y) in matches]

print(matches)  # A list of teaching years as int
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73759253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档