【问题标题】:Searching for substrings in a string that match a certain condition搜索字符串中匹配特定条件的子字符串
【发布时间】:2019-06-26 03:14:13
【问题描述】:

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

提前感谢您的帮助!

【问题讨论】:

  • 你可以试试r'(?!^)(?&lt;!\bNo\.\s)(?&lt;!\bQuestion\s)(?&lt;!\d)(?!(?:19[6-9][0-9]|20[01][0-9]|2020)(?!\d))(\d+(?!\d)e?)'
  • '1975e' 呢?

标签: python regex pandas


【解决方案1】:

你可以使用

(?!^)(?<!\bNo\.\s)(?<!\bQuestion\s)(?<!\d)(?!(?:19[6-9][0-9]|20[01][0-9]|2020)(?!\d))(\d+(?!\d)e?)

见regex demo

新增部分为(?&lt;!\d)(?!(?:19[6-9][0-9]|20[01][0-9]|2020)(?!\d))(\d+(?!\d)e?):

  • (?&lt;!\d) - 当前位置左侧不允许有数字
  • (?!(?:19[6-9][0-9]|20[01][0-9]|2020)(?!\d)) - 如果紧挨当前位置的右侧有一个从 1960 到 2020 的数字后面没有数字,则匹配失败
  • (\d+(?!\d)e?) - 第 1 组(您将提取的内容):1+ 个数字,后面没有数字和可选的 e 字母

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多