4

假设我有这三行:

the quick brown fox
the brown fox
the quick brown quick fox

正则表达式可以用于裁剪除单词之外的每一行中的所有内容quick吗?

最终结果将如下所示:

quick

quickquick
4

4 回答 4

4

具体细节取决于您使用的语言,但这里有一些使用正则表达式执行此操作的常用方法(Python 中的代码示例):

  • 查找目标字符串的所有匹配项,然后将每个匹配项组合成一个字符串:

    >>> import re
    >>> s = 'the quick brown quick fox'
    >>> ''.join(re.findall('quick', s))
    'quickquick'
    
  • 构造一个正则表达式来匹配目标字符串之外的所有内容,然后将每个匹配项替换为一个空字符串(这通常比列出的其他替代方案要困难得多)

    >>> re.sub('(?!quick|(?<=q)uick|(?<=qu)ick|(?<=qui)ck|(?<=quic)k).', '', s)
    'quickquick'
    
  • 使用捕获组匹配所有内容,直到出现目标字符串,然后仅替换为目标字符串:

    >>> re.sub('.*?(quick|$)', r'\1', s)
    'quickquick'
    

如果您的字符串如示例中那样有多行,则可以先在换行符处拆分字符串,或者调整解决方案以保留换行符,例如:

>>> s = '''the quick brown fox
... the brown fox
... the quick brown quick fox'''
>>> print ''.join(re.findall('quick|[\r\n]', s))
quick

quickquick
>>> print re.sub('.*?(quick|$)', r'\1', s, flags=re.MULTILINE)
quick

quickquick
于 2012-10-23T16:33:59.600 回答
1

单独的正则表达式不用于操作字符串。它只进行模式匹配。根据您用于实现它的工具,您通常可以使用正则表达式匹配进行字符串替换。例如,在 Bash 终端中,您可以使用 Sed,或者在 PHP 中,您可以使用 preg_replace()。

于 2012-10-23T16:27:03.230 回答
0

是的,正则表达式能够通过实现lookaheadlookbehind构造进行搜索。

例如,这是一个使用正向前瞻表达式的 Python 程序,它可以满足您的需要:

import re

s = '''the quick brown fox
the brown fox
the quick brown quick fox'''

rx = re.compile('(?!quick).*')
print rx.findall(s)

输出:

['the quick brown fox', '', 'the brown fox', '', 'the quick brown quick fox', '']
于 2012-10-23T16:40:20.553 回答
0

为此使用sed :

sed -r 's/(quick|)./\1/g' file.txt
于 2012-10-23T17:23:13.547 回答