正则表达式:如何从文本中查找和提取首字母缩略词和相应的首字母缩略词定义?

时间:2013-08-19 12:06:36

标签: regex text-analysis acronym

我想做一些像这个问题中提出的建议 - 但是在更一般的层面上: Regular Expression for Acronyms

输入示例:

  

“在一组开创性的论文中, Feddersen和Pesendorfer (1996年,1999年),以后 FP ,合并......已被标记为” swing选民的诅咒,“从现在开始 SVC 。预测......开始使用静态应用安全测试的最佳方式( SAST )工具..来自拉丁语 ante meridiem AM )含义在中午之前......“

结果:

  1. ['Feddersen and Pesendorfer','FP']
  2. ['摇摆选民的诅咒','SVC']
  3. ['静态应用安全测试','SAST']
  4. ['ante meridiem','A.M。']
  5. 当然有很多可能的'信号'的首字母缩略词。我在下面列出了一些。:

    • 括号: ...(...)
    • ...此后......
    • ...从现在开始......
    • ......之后......
    • ......简称......
    • ......随后......
    • ......因此......
    • ......从此......
    • ......以下......

    也许有两个正则表达式是有益的;一个用于括号,一个用于所有其他,因为它们的结构差别很大。

    只专注于首字母缩略词,即。忽略由 SOund Navigation And Ranging 创建的声纳等案例。

    是否可以用正则表达式进行这样的思考,如果是这样的话,你会怎么做呢?

1 个答案:

答案 0 :(得分:1)

有可能。我首先定义描述单词系列后面跟着缩写词定义(SOWFBAAD)的所有单独规则,然后在define语句中将这些规则拼接在一起。

例如,如果您正在寻找电子邮件地址,您可以使用此Perl兼容正则表达式(PCRE),它首先定义RFC 5322中的所有规则,然后查找看起来像电子邮件地址的内容:

(?x)
    (?(DEFINE)

        (?<addr_spec> (?&local_part) @ gbase\.tt )
        (?<local_part> (?&dot_atom) | (?&quoted_string) | (?&obs_local_part) )
        (?<domain> (?&dot_atom) | (?&domain_literal) | (?&obs_domain) )
        (?<domain_literal> (?&CFWS)? \[ (?: (?&FWS)? (?&dtext) )* (?&FWS)? \] (?&CFWS)? )
        (?<dtext> [\x21-\x5a] | [\x5e-\x7e] | (?&obs_dtext) )
        (?<quoted_pair> \\ (?: (?&VCHAR) | (?&WSP) ) | (?&obs_qp) )
        (?<dot_atom> (?&CFWS)? (?&dot_atom_text) (?&CFWS)? )
        (?<dot_atom_text> (?&atext) (?: \. (?&atext) )* )
        (?<atext> [a-zA-Z0-9!#$%&''*+/=?^_`{|}~-]+ )
        (?<atom> (?&CFWS)? (?&atext) (?&CFWS)? )
        (?<word> (?&atom) | (?&quoted_string) )
        (?<quoted_string> (?&CFWS)? "" (?: (?&FWS)? (?&qcontent) )* (?&FWS)? "" (?&CFWS)? )
        (?<qcontent> (?&qtext) | (?&quoted_pair) )
        (?<qtext> \x21 | [\x23-\x5b] | [\x5d-\x7e] | (?&obs_qtext) )

        # comments and whitespace
        (?<FWS> (?: (?&WSP)* \r\n )? (?&WSP)+ | (?&obs_FWS) )
        (?<CFWS> (?: (?&FWS)? (?&comment) )+ (?&FWS)? | (?&FWS) )
    #   (?<ccontent> (?&ctext) | (?&quoted_pair) )
        (?<ccontent> (?&ctext) | (?&quoted_pair) | (?&comment) )
        (?<ctext> [\x21-\x27] | [\x2a-\x5b] | [\x5d-\x7e] | (?&obs_ctext) )

        # obsolete tokens
        (?<obs_domain> (?&atom) (?: \. (?&atom) )* )
        (?<obs_local_part> (?&word) (?: \. (?&word) )* )
        (?<obs_dtext> (?&obs_NO_WS_CTL) | (?&quoted_pair) )
        (?<obs_qp> \\ (?: \x00 | (?&obs_NO_WS_CTL) | \n | \r ) )
        (?<obs_FWS> (?&WSP)+ (?: \r\n (?&WSP)+ )* )
        (?<obs_ctext> (?&obs_NO_WS_CTL) )
        (?<obs_qtext> (?&obs_NO_WS_CTL) )
        (?<obs_NO_WS_CTL> [\x01-\x08] | \x0b | \x0c | [\x0e-\x1f] | \x7f )

        # character class definitions
        (?<VCHAR> [\x21-\x7E] )
        (?<WSP> [ \t] )
    )
    ((?&addr_spec))

当然这个表达式确实使用了递归,这种递归在许多正则表达式中都不能很好地发挥作用。要解决这个问题,你可以简单地注释掉ccontent并取消注释另一个ccontent注释,只要你接受该表达式将不再找到递归注释。

然而

单独构造一个正则表达式可能会给你留下一个难以读取,调试或修改的表达式。因此,您可能最好循环浏览SOWFBAAD定义列表。