Dat*_*e99 1 python regex pandas
这是我其他文章的延续:在特定条件下从字符串中提取数字
总而言之,我有一些字符串存储在数据框中,我想提取与所有条件匹配的第一个数字(如果存在)。条件如下:
数字不能在字符串的开头
它不能出现在单词“ 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()
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用:
\b(?!196[0-9]\d|20[012][0])\d+\b
Run Code Online (Sandbox Code Playgroud)
来计算不在1960年和2020年之间的数字,但这似乎行不通。我也不明白如何抓住e(如果存在)。
范例1:
"Trial No. 32819 Question 485 Article 787e"
Run Code Online (Sandbox Code Playgroud)
我希望正则表达式返回
[787e]
Run Code Online (Sandbox Code Playgroud)
范例2:
"2981 XYZ Legislature"
Run Code Online (Sandbox Code Playgroud)
我希望正则表达式返回
None
Run Code Online (Sandbox Code Playgroud)
示例3”
"Addendum217Null"
Run Code Online (Sandbox Code Playgroud)
我希望正则表达式返回
[217]
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的帮助!
您可以使用
(?!^)(?<!\bNo\.\s)(?<!\bQuestion\s)(?<!\d)(?!(?:19[6-9][0-9]|20[01][0-9]|2020)(?!\d))(\d+(?!\d)e?)
Run Code Online (Sandbox Code Playgroud)
新的部分是(?<!\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到2020不紧跟数字,则匹配失败的否定前行(\d+(?!\d)e?)-第1组(您将提取的内容):1+位数字,后跟数字和可选e字母| 归档时间: |
|
| 查看次数: |
42 次 |
| 最近记录: |