我对正则表达式了解不多。我需要提取字符串中由左右括号括起来的单个单词。
例如,在string
(ROOT (S (NP (NNP Washington) (NNP (CNN)) (NNP Donald) (NNP Trump)) (VP (VBD was) (VP (VBN asked) (PP ( by) (NP (NP (DT a) (NN member)) (PP (IN of) (NP (DT a) (NNP Fox) (NNP News) (NN town) (NN hall) (NN audience))))) (NP-TMP (DT this) (NN week)) (SBAR (WHNP (WP what)) (S (NP (PRP he)) (VP (MD would) (VP (VB do) (S (VP (TO to) (VP (VB reduce) (NP (JJ violent) (NN crime)) (PP (IN in) (NP (DT the) (NNS country's) (JJ inner) (NN cities.)))))))))))))) (NN debate,)) (ADJP (JJ due) (S (VP (TO to) (VP (VB be) (VP (VBN broadcast) (S (NP (JJ live)) (ADJP (RBS most) (RB everywhere.))))))))))))))))
我需要得到(CNN)
和( by)
子字符串。
编辑
def fixeup_tree_string(T):
change_index=[]
Match = [(m.start(0), m.end(0),'Y') for m in re.finditer(r"\(\s*[\w|#|~|!|@|#|$|%|^|&|*|<|>|.|,|;|:|`|'''|_|-|+|/]+\s*\)", T)]
if len(Match)==0:
return T
if Match[0][0]!=0:
change_index.append((0,Match[0][0],'N'))
for i in range(len(Match)-1):
change_index.append(Match[i])
change_index.append((Match[i][1],Match[i+1][0],'N'))
change_index.append(Match[-1])
if Match[len(Match)-1][1]< len(T):
change_index.append((Match[len(Match)-1][1],len(T),'N'))
new_T = []
for r in change_index:
if r[2]=='N':
for i in range(r[0],r[1]):
new_T.append(T[i])
else:
str = T[r[0]:r[1]].replace(' ','')
str = str.split(')')[0].split('(')[-1]
str = '(NN '+str +')'
for x in str:
new_T.append(x)
new_T = (''.join(new_T))
return new_T
1条答案
按热度按时间wa7juj8i1#
您可以尝试:
其中
x
是输入。**注意-**您必须在程序前使用
import re
语句导入re,以使用正则表达式函数说明-
re.findall
是一个返回正则表达式找到的匹配数组的模块。参数如下:regex, string
r"\(\s*[a-zA-Z]+\)"
指定正则表达式是由r
在开始时给出的 raw string。\(
表示左括号'('\s*
表示左括号后面可以跟xero或更多空格[a-zA-Z]+
匹配里面的字母(一个或多个)\s*
表示文本后面可以有零个或多个空格,然后\)
表示结尾')'编辑1 -
为了回答你在评论中的第二个疑问,你可以试试这个: