【问题标题】:regex - pulling the nth element from a string正则表达式 - 从字符串中提取第 n 个元素
【发布时间】:2021-09-03 07:43:20
【问题描述】:

我正在尝试使用我认为是 python 版本的数据提取数据,到目前为止它一直在工作,但现在我遇到了一些数据,其中包含不需要的数字(这将在我尝试处理的文档中发生变化),所以我想知道是否有办法跳过这些数字。我使用的锚将是相同的,在下面的示例中是乔治亚州。单词和数字都被小圆圈隔开,所以它很容易,只是在实现一些 stackoverflow 帮助解决我的问题时遇到了麻烦。

我用过的,我需要的会加粗:

格鲁吉亚 * 372,000 * 0 * 0 * 145,982 * 36,000 * 0.09216

我一直使用这个公式来抓取锚字,然后使用另一个代码来抓取下面的单词或数字,它一直有效。 (Match(0).Value) 我尝试将 0 更改为 5 以尝试获取第 6 个值,但它不允许我这样做。 (?RegEx skip word 更新:从某人那里得到了一些帮助,建议我尝试使用它:

(Georgia)(?:\s*\*\s*\S+)(?:\s*\*\s*\S+)(?:\s*\*\s*\S+)(?:\s*\*\s*\S+)(?:\s*\*\s*\S+)\s*\*\s*([0-9,.]+)

,我可以使用这部分

(Georgia)(?:\s*\*\s*\S+){5}

突出显示我想要提取的值,但我无法弄清楚如何突出显示我想要的值。

【问题讨论】:

    标签: r regex


    【解决方案1】:

    我希望我能正确理解你想要什么

    您可以使用此正则表达式,并将“4”更改为您想要获取该术语的任何数字 https://regex101.com/r/zXiSTv/1/

    例如:

    In [1]: import re
    
    In [2]: def get_nth_element(text, element):
       ...:     result = re.search(r"(Georgia)(?: \* [^ ]+){{{}}} \* ([^ ]+)".format(element), text)
       ...:     return result.group(1), result.group(2)
       ...:
    
    In [3]: get_nth_element("Georgia * 372,000 * 0 * 0 * 145,982 * 36,000 * 0.09216", 3)
    Out[3]: ('Georgia', '145,982')
    
    In [4]: get_nth_element("Georgia * 372,000 * 0 * 0 * 145,982 * 36,000 * 0.09216", 4)
    Out[4]: ('Georgia', '36,000')
    
    In [5]: get_nth_element("Georgia * 372,000 * 0 * 0 * 145,982 * 36,000 * 0.09216", 1)
    Out[5]: ('Georgia', '0')
    
    In [6]: get_nth_element("Georgia * 372,000 * 0 * 0 * 145,982 * 36,000 * 0.09216", 0)
    Out[6]: ('Georgia', '372,000')
    

    【讨论】:

    • 您好,非常感谢您的帮助!不幸的是,我是一个彻头彻尾的白痴,刚刚意识到我正在尝试做的是 R-Regex。非常感谢您的帮助,尽管您对此很感兴趣!
    【解决方案2】:

    您可以使用 2 个捕获组,并在第二个捕获组中匹配带有可选小数部分的数字

    \b(Georgia)(?:[^*]*\*){5}\s*(\d+(?:,\d+)?)\b
    
    • \b防止部分匹配的单词边界
    • (Georgia)组 1 中捕获 Georgia
    • (?:[^*]*\*){5} 重复 5 次匹配除 * 之外的任何字符,然后匹配 *
    • \s* 匹配可选的空白字符
    • (\d+(?:,\d+)?)组 2 中捕获 1+ 个数字,并带有可选的小数部分
    • \b一个字边界

    Regex demo

    library(stringr)
    
    s <- "Georgia * 372,000 * 0 * 0 * 145,982 * 36,000 * 0.09216"
    str_match_all(s, "\\b(Georgia)(?:[^*]*\\*){5}\\s*(\\d+(?:,\\d+)?)\\b")[[1]][,2:3]
    

    输出

    [1] "Georgia" "36,000"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 2011-11-13
      • 2016-12-09
      • 2014-08-25
      • 1970-01-01
      • 2021-09-12
      相关资源
      最近更新 更多