【问题标题】:Extracting all rows that matches a "pattern" from a range从范围中提取与“模式”匹配的所有行
【发布时间】:2019-08-23 08:37:05
【问题描述】:

我对此很陌生,我在谷歌上搜索过 regex 和 RE2,但几乎没有找到帮助。似乎是一个相当小众的话题,而且材料不是很全面。将不胜感激任何帮助。谢谢!

我有一个包含超过 30k 行文本的列表,我想提取与此模式匹配的那些:

`=whatever`+whatever-whatever`+whatever/whatever.whatever

数据如下:

Detail 3
Detail 4
Detail 3
Detail 4
blah
blah
Detail 5
Detail 4
Detail 5
`=P2385`+P2385-M01 `+MC2385/5.0
`=BS2366`+P2366-A1 `+FIELD/14.5
`=P2385`+P2385-M02 `+MC2385/5.4
blah
blah
`=P2385`+P2385-M03 `+MC2385/5.5
`=P2385`+P2385-M04 `+MC2385/5.9
`=P2385`+P2385-M05 `+MC2385/6.0
`=BS2366`+P2366-A1 `+FIELD/14.5
`=P2385`+P2385-M06 `+MC2385/6.4
`=P2385`+P2385-M07 `+MC2385/6.5
`=P2385`+P2385-M08 `+MC2385/6.9
blah
blah
`=P2385`+P2385-M09 `+MC2385/7.0
`=P2385`+P2385-M10 `+MC2385/7.4
`=P2385`+P2385-M11 `+MC2385/7.5
`=P2385`+P2385-M12 `+MC2385/7.9
`=P2381`+P2381-B31 `+MC2381/12.5
blah
blah
`=P2381`+P2381-B32 `+MC2381/12.9
`=P2381`+P2381-B33 `+MC2381/13.0
`=P2370`+P2370-M01
blah
blah
`+MC2370/6.0
`=P2370`+P2370-M02 `+MC2370/6.4
`=P2370`+P2370-M03 `+MC2370/6.5
`=P2370`+P2370-M04 `+MC2370/6.9
`=BS2366`+P2366-A1 `+FIELD/14.5
`=P2368`+P2368-M01 `+MC2370/11.0
`=P2368`+P2368-M05 `+MC2370/12.0
`=BS2366`+P2366-A1 `+FIELD/14.5 `=P2366`+P2366-M01 `+MC2370/10.5
`=P2366`+P2366-M02 `+MC2370/10.9
Detail 3
Detail 4
Detail 3
blah
blah
Detail 4
Detail 5
Detail 5
blah
blah
Detail 4
Detail 5
blah
blah
blah
blah

正则表达式提取的输出应该如下所示:

`=P2385`+P2385-M01 `+MC2385/5.0
`=P2385`+P2385-M02 `+MC2385/5.4
`=P2385`+P2385-M03 `+MC2385/5.5
`=P2385`+P2385-M04 `+MC2385/5.9
`=P2385`+P2385-M05 `+MC2385/6.0
`=BS2366`+P2366-A1 `+FIELD/14.5
`=P2385`+P2385-M06 `+MC2385/6.4
`=P2385`+P2385-M07 `+MC2385/6.5
`=P2385`+P2385-M08 `+MC2385/6.9
`=P2385`+P2385-M09 `+MC2385/7.0
`=P2385`+P2385-M10 `+MC2385/7.4
`=P2385`+P2385-M11 `+MC2385/7.5
`=BS2366`+P2366-A1 `+FIELD/14.5
`=P2385`+P2385-M12 `+MC2385/7.9
`=P2381`+P2381-B31 `+MC2381/12.5
`=P2381`+P2381-B32 `+MC2381/12.9
`=P2381`+P2381-B33 `+MC2381/13.0
`=P2370`+P2370-M02 `+MC2370/6.4
`=P2370`+P2370-M03 `+MC2370/6.5
`=P2370`+P2370-M04 `+MC2370/6.9
`=P2368`+P2368-M01 `+MC2370/11.0
`=P2368`+P2368-M05 `+MC2370/12.0
`=BS2366`+P2366-A1 `+FIELD/14.5
`=P2366`+P2366-M01 `+MC2370/10.5
`=P2366`+P2366-M02 `+MC2370/10.9

【问题讨论】:

  • 只需将每次出现的whatever 替换为.+? 并转义你在那里的一个点(即\.),你应该有一个工作模式。

标签: regex google-sheets google-sheets-formula array-formulas textjoin


【解决方案1】:
=ARRAYFORMULA(TRANSPOSE(SPLIT(SUBSTITUTE("♦"&TEXTJOIN("♦", 1, 
 IFERROR(REGEXEXTRACT(A1:A, "`.+\+.+-.+\+.+/.+"))), " `=", "♦`="), "♦")))

【讨论】:

  • 谢谢!您介意详细说明您的方法和语法吗?
  • @W.B.Sam 当然,"'.+\+.+-.+\+.+/.+" 基本上是您的 "=whatever+whatever-whatever+whatever/whatever.whatever" where "whatever" is .+. then IFERROR` 消除了所有错误行并将它们设为空白。接下来,@ 987654328@ 使用唯一符号连接所有值 ♦. 然后 SUBSTITUTE 修复每行有多个模式的所有实例(例如第 43 行有两个项目),然后 SPLIT 将其拆分为唯一符号以获得你想要的结果
【解决方案2】:

要匹配示例中的特定数据,请使用以下模式:

^`=[A-Z0-9]+`\+[A-Z0-9]+-[A-Z0-9]+\s*`\+[A-Z0-9]+\/\d+\.\d+

测试here。该页面还解释了正则表达式的所有详细信息。

您可以使用通用的.+?,而不是特定的[A-Z0-9]+。


您没有指定列表的存储位置。


如果列表存储在文本文件中,那么您可以使用grep 作为工作的明显工具:

grep "^`=[A-Z0-9]+`\+[A-Z0-9]+-[A-Z0-9]+\s*`\+[A-Z0-9]+\/\d+\.\d+" input_file >output_file

地点:

  • > 是输出重定向操作符
  • input_file是输入文件的名字
  • output_file 是您要存储结果的文件的名称。

如果它在电子表格中,那么@player0 已经提供了一个很好的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 2016-01-18
    • 1970-01-01
    相关资源
    最近更新 更多