我有一个数组,如:
key = ['*', '(DATE*', '*', '*', '*)', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '(GPE*', '*)', '*', '*', '*', '(DATE)', '*']
我有一个我想要执行任务的数组,如
贯穿数组
一旦我找到以'('但不以'结尾'开头的条目
替换下一个''条目,直到我们找不到')'并将'*''替换为以'('
如果条目在'()之内,则应该被剥离。至于第二个元素(DATE)仅用DATE替换
我们有第二个条目'(DATE *'后跟'','','*)'所以这些条目应该只用DATE替换
输出应该是:key = ['*', 'DATE', 'DATE', 'DATE', 'DATE', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', 'GPE', 'GPE', '*', '*', '*', 'DATE', '*']
答案 0 :(得分:1)
我知道它不是pythonic,无论如何你可以尝试这个:
key = ['*', '(DATE*', '*', '*', '*)', '*', '*', '*', '*', '*', '*',
'*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '(GPE*', '*)',
'*', '*', '*', '(DATE)', '*']
for i in key:
if i.startswith('(') and not (i.endswith(')')):
a = key[key.index(i)+1:]
for j in a:
if j.endswith(')'):
a = a[:a.index(j)+1]
break
for l in range(key.index(i), key.index(i)+len(a)+1):
key[l] = i.strip('(').strip('*')
elif i.startswith('(') and i.endswith(')'):
key[key.index(i)] = i.strip('(').strip(')')
print(key)
它会给 O / P ,如:
['*', 'DATE', 'DATE', 'DATE', 'DATE', '*', '*', '*', '*', '*', '*',
'*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', 'GPE',
'GPE', '*', '*', '*', 'DATE', '*']
答案 1 :(得分:1)
`key = ['*', '(DATE*', '*', '*', '*)', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '(GPE*', '*)', '*', '*', '*', '(DATE)', '*']
outKeys = []
isFound = False
for k in key:
if k.startswith("(") and k.endswith(")"):
k = k[k.find("(")+1:k.find(")")]
elif k.startswith("("):
k = k[k.find("(")+1:k.find("*")]
isFound = k
elif k.endswith(")"):
k = isFound
isFound = False
elif isFound:
k = isFound
outKeys.append(k)
print(outKeys)`
这将给你输出:
['*', 'DATE', 'DATE', 'DATE', 'DATE', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', 'GPE', 'GPE', '*', '*', '*', 'DATE', '*']
答案 2 :(得分:1)
我建议你这个易于阅读的解决方案。我定义了另一个列表newKey
,以避免在迭代其owm元素时修改列表:
key = ['*', '(DATE*', '*', '*', '*)', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '(GPE*', '*)', '*', '*', '*', '(DATE)', '*']
newKey = []
next_x = None
for x in key:
if x.startswith('(') and x.endswith(')'):
newKey.append(x.strip('()*'))
elif x.startswith('('):
newKey.append(x.strip('(*'))
next_x = x.strip('(*')
elif x.endswith(')'):
newKey.append(next_x.strip('*)'))
next_x = None
elif next_x is not None:
newKey.append(next_x)
else:
newKey.append(x)
key = newKey[:]
print(key)
答案 3 :(得分:1)
您可以使用以下代码:
current_entry = None
for i, k in enumerate(key):
if k.startswith('(') and k.endswith(')'):
key[i] = k.strip('(').strip(')')
continue
if k.startswith('(') and not k.endswith(')'):
current_entry = k.strip('(').strip('*')
if current_entry:
key[i] = current_entry
if k.endswith(')'):
current_entry = None
答案 4 :(得分:1)
**Nothing but some regex and while loops**
import re
key = key = ['*', '(DATE*', '*', '*', '*)', '*', '*', '*', '*', '*', '*', '*', '*', '*',
'*', '*', '*', '*', '*', '*', '*', '*', '*', '(GPE*', '*)', '*', '*', '*', '(DATE)', '*']
val = 0
while val < len(key):
value = key[val]
if re.findall(r'\(',value):
value = re.findall(r'\w+', value)[0]
while re.findall(r'\)', key[val]) == []:
key[val] = value
val += 1
key[val] = value
val += 1
print key
输出 - ['*', 'DATE', 'DATE', 'DATE', 'DATE', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', 'GPE', 'GPE', '*', '*', '*', 'DATE', '*']
答案 5 :(得分:0)
可以使用简单的正则表达式完成:
string = ' '.join(['*', '(DATE*', '*', '*', '*)', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '(GPE*', '*)', '*', '*', '*', '(DATE)', '*'])
result = re.sub(r'\((.*?)\)', lambda m: ' '.join([m.group(1).replace('*', '').strip()
for n in range(1 if m.group(0).count('*') == 0 else m.group(0).count('*'))]), string).split(' ')
print(result)