2

我想做类似这个问题中建议的事情——但在更一般的层面上: 首字母缩略词的正则表达式

输入示例:

“在一组开创性的论文中,Feddersen 和 Pesendorfer (1996, 1999),以下简称FP,并入……从现在开始,被贴上了“摇摆选民的诅咒”的标签SVC。预测……最好的方法开始使用静态应用程序安全测试( SAST ) 工具......来自拉丁语ante meridiem ( AM ),意思是中午之前......”

结果:

  1. ['费德森和佩森多弗','FP']
  2. ['摇摆选民的诅咒','SVC']
  3. ['静态应用程序安全测试','SAST']
  4. ['下午','上午']

当然,首字母缩略词有许多可能的“信号”。我在下面列出了一些:

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

也许有两个正则表达式会有所帮助;一个用于括号,一个用于所有其他,因为它们的结构有很大不同。

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

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

4

1 回答 1

1

是的

有可能的。我将首先定义描述一系列单词的所有单独规则,然后是首字母缩略词定义(SOWFBAAD),然后将这些规则拼接在一个定义语句中。

例如,如果您正在寻找一个电子邮件地址,您可以使用这个 Perl Compliant Regular Expression (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 定义列表。

于 2013-08-20T15:52:19.363 回答