正则表达式替换包含整个条目的括号

时间:2014-04-17 10:12:00

标签: python regex notepad++

我有一个制表符分隔的txt文件。

1    (hi7 there)    my
2    (hi7)there    he3

我想在括号包含整个条目时删除括号(我不确定单词条目是否是描述它的正确单词,无论如何)

所以输出应该是

1    hi7 there    my
2    (hi7)there    he3

我知道我可以轻松找到如何删除所有括号。但是,只有当他们接受整个条目时,我才能找到如何删除括号。

我可以简单地使用notepad ++或python,以较快者为准吗?

4 个答案:

答案 0 :(得分:3)

这个expr似乎正确处理了所有可能性:

(?m)     # multiline mode
(^|\t)   # start of line of field 
\(       # (
   ([^\t]+?) # anything but a tab
\)       # )
(?=      # followed by...
   $|\t  # end of line or field
)

替换为\1\2

示例:

import re

rx = r'(?m)(^|\t)\(([^\t]+?)\)(?=$|\t)'

txt = """
1   (hi7 (the)re)   (my)
2   (hi7)there  he3
(22)    (hi7)there  he3
(22)    (hi7there)  (he3)
"""

print re.sub(rx, r'\1\2', txt)

结果:

1   hi7 (the)re my
2   (hi7)there  he3
22  (hi7)there  he3
22  hi7there    he3

答案 1 :(得分:2)

我认为这应该有用

f = open("file.txt")
for line in f:
 l = line.strip().split("    ")
 for word in l:
  if word[0] == "(" and word[-1] == ")":
   print (word[1:len(word)-1]),
  else:
   print (word),
 print

用于覆盖

import fileinput

for line in fileinput.FileInput("file.txt", inplace=1):
    l = line.strip().split("    ")
    s = ""
    for sent in l:
        if sent[0] == "(" and sent[-1] == ")":
            s += sent[1:len(sent) - 1] + "    "
        else:
            s += sent + "    "
    print s[:-1]

答案 2 :(得分:0)

您可以在python regexp表达式中使用制表符\t,因此您可以这样匹配:

>>> import re
>>> re.match('^\([^\t]+\)\t.*$', '(hi7 there)\tmy')
>>> <_sre.SRE_Match object at 0x02573950>
>>> re.match('^\([^\t]+\)\t.*$', '(hi7)there\tmy')
>>>

一旦你知道如何匹配你的字符串,只有当行匹配时才很容易删除括号。

答案 3 :(得分:0)

如果它们实际上是 tab 分隔符,则可以替换

\t\(([^\t]*)\)\t

\t           # a tab
\(           # an opening parenthesis
(            # open the capturing group
    [^\t]*   # anything but a tab
)
\)
\t

\t\1\t

我们的想法是捕获相关括号内的文本,并将其用于替换后引用\1

请参阅demo