【问题标题】:Extracting numbers from a string under certain conditions在特定条件下从字符串中提取数字
【发布时间】:2019-10-26 00:28:47
【问题描述】:

我有一些使用 pandas 存储在数据框中的字符串,如果存在,我想从中提取所有数字。这些数字必须满足的条件非常具体,我不确定是否可以使用正则表达式来解决我的问题。条件是:

  • 数字不能位于字符串的开头
  • 它不能出现在“No.”之后或“Question”之后

如果可能的话,如果数字后面有一个 e,我也想保留它。然而,这不太重要。

这是我迄今为止找到的所有数字,但我不知道如何编码我上面提到的条件。

testNumbers = re.findall(r'\d+', row['Name'])

对于给定的字符串:“Test T860 Article No. 9712250 787”

我希望正则表达式返回

[860, 787]

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:

    你可以使用

    (?!^)(?<!\d)(?<!\bNo\.\s)(?<!\bQuestion\s)(\d+)(?!\d)
    

    在 Python 中,声明为原始字符串文字:

    pattern = r'(?!^)(?<!\d)(?<!\bNo\.\s)(?<!\bQuestion\s)(\d+)(?!\d)'
    

    regex demo

    详情

    • (?!^) - 不在字符串的开头
    • (?&lt;!\d) - 当前位置之前不允许有数字
    • (?&lt;!\bNo\.\s) - 不允许 No. 和紧接在其前面的空格
    • (?&lt;!\bQuestion\s) - 没有 Question 并且允许紧接在前面的空格
    • (\d+) - 第 1 组:一位或多位数字
    • (?!\d) - 不允许紧跟在当前位置之后的数字。

    在 Pandas 中,你可以像这样使用它

    df = pd.DataFrame({'text':[" Test T860 Article No. 9712250 787"," Test F199 Article Question 9712250787"]})
    df['numbers'] = df['text'].str.findall(r'(?!^)(?<!\d)(?<!\bNo\.\s)(?<!\bQuestion\s)(\d+)(?!\d)').apply(','.join)
    

    输出:

    >>> df
                                         text  numbers
    0       Test T860 Article No. 9712250 787  860,787
    1   Test F199 Article Question 9712250787      199
    

    【讨论】:

    • 你能调整一下,让它不匹配字符串开头的数字吗?
    • 只要(?!^) 就可以了。
    • 小疑问。这里的否定后视顺序是否无关紧要,因为它们都引用(\d+)
    • @yatu 它们是零宽度断言。都是在\d+之前执行的。
    【解决方案2】:

    这里我们可以使用带有单词边界和量词的表达式:

    \b[A-Z]+(\d+)\b|\b([0-9]{1,3})\b
    

    Demo

    正则表达式

    如果不需要此表达式或您想修改它,请访问regex101.com

    正则表达式电路

    jex.im 可视化正则表达式:

    【讨论】:

      猜你喜欢
      • 2022-08-10
      • 1970-01-01
      • 2015-06-07
      • 2021-12-10
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      相关资源
      最近更新 更多