正则表达式可用于裁剪吗?

时间:2012-10-23 16:24:58

标签: regex regex-negation

假设我有这三行:

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

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

最终结果如下:

quick

quickquick

4 个答案:

答案 0 :(得分:4)

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

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

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

    >>> 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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

是的,通过实施lookaheadlookbehind constructions,正则表达式能够进行搜索。

例如,这是使用正向前瞻性表达式的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', '']

答案 3 :(得分:0)

使用 sed

sed -r 's/(quick|)./\1/g' file.txt