python - 搜索字符串中匹配特定条件的子字符串
问题描述
这是我另一篇文章的延续:在特定条件下从字符串中提取数字
总而言之,我有一些存储在数据框中的字符串,我想提取与所有条件匹配的第一个数字(如果存在)。以下是条件:
数字不能在字符串的开头
它不能出现在“No.”之后或“Question”之后
数字不能介于 1960 - 2020 之间
如果数字后面紧跟字母e,我想用它提取e
这是我到目前为止找到的数字,它处理前两个条件:
for index, row in df.iterrows():
test = re.search(r'(?!^)(?<!\bNo\.\s)(?<!\bQuestion\s)(\d+)(?!\d)',
row['name'])
if test:
df.loc[
df['name'] == row['name'], ['id']] = test.group()
我也尝试过使用:
\b(?!196[0-9]\d|20[012][0])\d+\b
考虑到数字不在 1960 年和 2020 年的值之间,但它似乎不起作用。如果 e 存在,我也不明白如何捕捉它。
示例 1:
"Trial No. 32819 Question 485 Article 787e"
我希望正则表达式返回
[787e]
示例 2:
"2981 XYZ Legislature"
我希望正则表达式返回
None
示例 3"
"Addendum217Null"
我希望正则表达式返回
[217]
提前感谢您的帮助!
解决方案
您可以使用
(?!^)(?<!\bNo\.\s)(?<!\bQuestion\s)(?<!\d)(?!(?:19[6-9][0-9]|20[01][0-9]|2020)(?!\d))(\d+(?!\d)e?)
查看正则表达式演示
新的部分是(?<!\d)(?!(?:19[6-9][0-9]|20[01][0-9]|2020)(?!\d))(\d+(?!\d)e?)
:
(?<!\d)
- 当前位置左侧不允许有数字(?!(?:19[6-9][0-9]|20[01][0-9]|2020)(?!\d))
- 如果在当前位置的右侧有一个从1960
to 到2020
后面没有数字的数字,则匹配失败的负前瞻(\d+(?!\d)e?)
- 第 1 组(您将提取的内容):1 个以上的数字,后面没有数字和可选e
字母
推荐阅读
- ios - 如何从 UITabBarController 中的当前视图恢复到以前的视图?
- objective-c - 在 Kotlin 中快速枚举 w Objective-C typedef
- python - dynamic_rnn 中的初始状态作为占位符
- java - 如何成功循环这个 I/O 程序?
- react-native - React Native:FlatList with require Images 不高效
- c# - ASP.NET Core Razor 页面锚标记在区域内不起作用
- jquery - jQuery 悬停效果 - 如何让它变慢
- java - 如何使用 JOGL 处理和返回数组
- reactjs - 在 reactjs 中输入 3 个值时如何自动关注美元值?
- c# - 全局变量改变另一个类的值(C#)