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

时间:2019-06-25 18:52:56

标签: python regex pandas

这是我其他帖子的延续: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]

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:5)

您可以使用

(?!^)(?<!\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))-如果在当前位置的右侧紧邻19602020的数字后面没有数字
  • (\d+(?!\d)e?)-第1组(您将要提取的内容):1个以上的数字,后跟数字和可选的e字母
相关问题