R中的正则表达式匹配指定的单词,当它们全部(两个或更多)在特定行中的特定距离内以任何顺序出现时

时间:2017-02-24 11:58:33

标签: r regex

我有双重挑战。 首先,我希望以任何顺序匹配在特定距离内包含两个(或最终更多)指定单词的行。

使用环视我设法选择匹配两个或更多单词的行,而不管它们发生的顺序如何。我也可以轻松地在同一行中添加更多单词,因此当必须出现更多单词以便选择时,这也可以毫不费力地应用。缺点是无法详细说明它们之间的最大距离。

^(?=.*\john)(?=.*\jack).*$

通过使用管道运算符,我可以详细说明可能出现这些术语的顺序以及它们之间可接受的距离,但是当应该匹配更多单词时,代码会变得冗长且错误敏感。

jack.{0,100}john|john.{0,100}jack

有没有办法在一个正则表达式中结合两种方法的各自优势?

其次,理想情况下我只希望'杰克'和'约翰'(并且在行中选择但不是整行。 是否有可能一次性完成这一切?

1 个答案:

答案 0 :(得分:1)

对于这种情况,您必须使用第二种方法。但单凭正则表达式是不可能的。你必须要求paste之类的语言工具帮助才能构建一个正则表达式(以第二种格式给出)。

在python中,我会在下面创建一个很长的正则表达式。

>>> def create_reg(lis):
    out = []

    for i in lis:
        out.append(''.join(i) + '|' + ''.join([i[2],i[1], i[0]]))
    return '(?:' + '|'.join(out) + ')'

>>> lst = [('john', '{0,100}', 'jack'), ('foo', '{0,100}', 'bar')]
>>> create_reg(lst)
'(?:john{0,100}jack|jack{0,100}john|foo{0,100}bar|bar{0,100}foo)'
>>>