【问题标题】:Is there a pattern matching and catching functionality in R as there is in perlR 中是否有与 perl 中一样的模式匹配和捕获功能
【发布时间】:2017-02-14 14:41:39
【问题描述】:

我有一个文本文件,正在尝试提取模式。在 perl 中,我使用 $1 进行匹配,如 What does $1 mean in Perl?

我想知道 R 是否有类似的功能。这是我的意思的示例

a=readLines('xxx.txt')
"{1:F21CRESUS33XLIQ9590112170}{2:O1030747170228BNPAGB22XCIT95901121701702280629U}{3:{103:GLBH}}{4"
 [914] ":20:PK836J9GD2HI7SWQ"                                                                            
 [915] ":23B:CRED"                                                                                       
 [916] ":32A:170214USD2154,252"                                                                          
 [917] "50:ABNYUS33XXXX"                                                                                 
 [918] "/1Jose Lugo"                                                                                     
 [919] "/2931 Corte De Luna"                                                                             
 [920] "/3 Seattle"                                                                                      
 [921] "/498104, United States"                                                                          
 [922] "59F:BPAHCUHHXXXX"                                                                                
 [923] "/1 Jossef   Goldberg"                                                                            
 [924] "/21220 Bradford Way"                                                                             
 [925] "/3 Seattle"                                                                                      
 [926] "/498104, United States"                                                                          
 [927] ":71A:OUR"                                                                                        
 [928] "-}"                                                                                              
 [929] "{1:L01BARCGB21X05G7115765182}{2:O1030946170226ABBYGB2LXXXX71157651821702261046S}{3:{103:WJHX}}{4"
 [930] ":20:YZDSKFJNXV4BE3MP"                                                                            
 [931] ":23B:CRED"                                                                                       
 [932] ":32A:170214USD63362,31"                                                                          
 [933] "50:ABBYGB2LXXXX"                                                                                 
 [934] "/1Jossef Goldberg"                                                                               
 [935] "/21220 Bradford Way"                                                                             
 [936] "/3 Seattle"   

我想做的是测试一个条件,如果该行带有特定字符,然后搜索该行以查看它是否包含另一个模式,并将它们 $pull$ 出来(如在 perl 中)。

在伪代码中:

pattern1='^{1:'
pattern2='CU'
if (!is.null(line)){
  if(grep(pattern1, line)){
    if(grep(pattern2,line)){ print(substr(line,a,b), plus some other patters if they match the regex)
    }                       
  }
}

我也想知道如何启动它以开始阅读这些行

【问题讨论】:

  • 可能是x <- paste0(a, collapse = "\n"),然后是regmatches(x, gregexpr("(?sm:^{1.*?CU)(?-s:.*)", x, perl=TRUE))
  • 这不是一个真正的perl 问题,是吗?
  • 适用于 Wiktor。 ?sm: 和 ?s: 在 gregexpr 中代表什么?谢谢
  • 请参阅?regex 了解 R 中的正则表达式的概述。

标签: r regex pattern-matching


【解决方案1】:

首先,我建议加入\n

x <- paste0(a, collapse = "\n")

那么你就可以用

regmatches(x, gregexpr("(?sm:^{1.*?CU)(?-s:.*)", x, perl=TRUE))

(?sm:^{1.*?CU)(?-s:.*) 是匹配的正则表达式模式:

  • (?sm:^{1.*?CU) - 行首(^ 将匹配行首位置,因为 ?m 启用此行为),然后 {1 文字字符序列,然后 .*? 将匹配任何 0+ 字符(如 (?s) 使. 匹配任何符号,包括换行符)尽可能少(因为 *? 是一个惰性量词)直到第一个 CU
  • (?-s:.*) - .* 将匹配行的其余部分((?-s:) 组关闭之前由 (?s) 启用的 DOTALL 修饰符)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    相关资源
    最近更新 更多