【问题标题】:How to write a regex pattern to extract the location from AMT withdrawal Transactions in a bank statement如何编写正则表达式模式以从银行对帐单中的 AMT 提款交易中提取位置
【发布时间】:2021-01-28 05:30:04
【问题描述】:

我希望编写一个正则表达式模式来从 35 万条记录的数据的叙述字符串中提取地址或位置。

txn_add <- data.frame(NARRATION=c("$ $ $ +YBL PATAUDI CHOWK \ $",
                  "$ $ -ATM CASH 83181 + MAIN BHAWANA ROAD NEW DELHI $",
                  "$ $ [5839/P1TNDE06/+RAGHUBARPURA $",
                  "$ MAXIMUMOUTFITS PRIVATE LIMITED } $ ATDELHIIN- $ $ /5631 $",
                  "$ ATM CASH-N4077800-+SPRINGFIELDCOLONYFFAR IDABADHRIN-04/06/18 $ /5631 ( $ $ VERIFICATION $"))

我运行了以下正则表达式模式:

gsub(".*[:|+]([^.]+)[$|\\|\\/].*", "\\1", txn_add$NARRATION)

我得到的输出是:

[1] "YBL PATAUDI CHOWK  "                                                  
[2] " MAIN BHAWANA ROAD NEW DELHI "                                        
[3] "RAGHUBARPURA "                                                        
[4] "$ MAXIMUMOUTFITS PRIVATE LIMITED } $ ATDELHIIN- $ $ /5631 $"          
[5] "SPRINGFIELDCOLONYFFAR IDABADHRIN-04/06/18 $ /5631 ( $ $ VERIFICATION "

此输出不正确,因为我必须实现一些条件: 地址可以从:

1. '+'
2. '@'
3. ' AT '
4. ':'
5. <P|S><SBI><P|S>              # EXACT TEXT PRECEEDED AND FOLLOWED BY PUNCTUATION OR SPACE
6. <NNN> FOLLOWED BY <P|S|A>    # 3 NUMBERS FOLLOWED BY EITHER PUNCTUATION OR SPACE OR ALPHA

并以 :

结尾
1. -
2. / 
3. $
4. \
5.<NNNNNNN>     # Combination of numbers

可以包含

Alphabets, numbers, dot (.), dash (-),space ( ), coma(,),underscore (_) brackets(()) at (@), hash (#) and(&) semi colon (;) 

这是从交易中提取地址,期望的输出将是:

[1] "YBL PATAUDI CHOWK"                                                  
[2] "MAIN BHAWANA ROAD NEW DELHI "                                        
[3] "RAGHUBARPURA "                                                        
[4] "DELHIIN"          
[5] "SPRINGFIELDCOLONYFFAR IDABADHRIN"

我无法获得所需的输出。接下来我可以尝试什么?

【问题讨论】:

    标签: r regex pattern-matching


    【解决方案1】:

    您可以使用捕获组

    (?:[+@:]|\bAT(?!M))\s*([A-Z]+(?:\s+[A-Z]+)*)
    

    说明

    • (?:非捕获组
      • [+@:] 匹配+ @ : 之一
      • |或者
      • \bAT(?!M) 匹配 AT 后不跟 M
    • )关闭群
    • \s* 匹配 0+ 个空白字符
    • ( 捕获第 1 组
      • [A-Z]+(?:\s+[A-Z]+)* 匹配字符 A-Z,其间有 1+ 个空白字符
    • )关闭第一组

    查看regex demo

    与分组前后的所有子匹配:

    sub(".*(?:[+@:]|\\bAT(?!M))\\s*([A-Z]+(?:\\s+[A-Z]+)*).*", "\\1", txn_add$NARRATION, perl=TRUE)
    

    【讨论】:

    • 谢谢先生,这在某些情况下运行良好,但它无法处理某些情况,例如:“$ USHAHIGHWAYFILLINGSFARIDABADIN-23/08 /18 $ /5631 (Ref# $ VERIFICATION $ ",为此所需的输出是 "USHAHIGHWAYFILLINGSFARIDABADIN"
    • @PiyushSharma 像这样试试.*?(?|(?:[+@:]| AT(?!M\b))\s*([A-Z]+(?:\s+[A-Z]+)*)|\b([A-Z]+(?:\s+[A-Z]+)*)-\d).*ideone.com/fKlnyN
    猜你喜欢
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2023-02-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2021-11-11
    相关资源
    最近更新 更多