Skip to main content
 首页 » 编程设计

python之在字符串中搜索符合特定条件的子串

2025年05月04日35sharpest

这是我另一篇文章的延续:Extracting numbers from a string under certain conditions

总而言之,我有一些字符串存储在数据框中,我想提取第一个符合所有条件的数字(如果存在)。条件如下:

  • 数字不能在字符串的开头

  • 它不能出现在“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?) 

参见 regex demo

新的部分是(?<!\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 的数字信