2016-04-12 2 views
2

Я новичок в Python, и вот моя проблема. У меня есть набор слов:Как заключить конкретное слово в скобки?

entities = ['blab', 'r1', 'zss'] 

Я хочу, чтобы обнаружить их, и я хочу, чтобы инкапсулировать их в случае, если не

Например:

this r1 is about zsse->this [r1] is about [zsse]

Опять же, если они уже инкапсулированы, я ничего не изменю, например, [ blablab r1 blabala ] все равно будет таким же.

Я пытался что-то, но он не работает:

for s in sentences: 
    for e in entities: 
     if re.search(r"\[\[%s\]\]" % e, s): 
      pass 
     else: 
      s=s.replace(e,'[['+e+']]') 

     New_sentences.append(s) 
+0

Вы должны расширить регулярное выражение, чтобы позволить ноль или более символов до и после слова. Что может быть что угодно, кроме ... – usr2564301

+0

Вы хотите, чтобы слова были немедленно заключены в '[]' или в этих скобках могло быть больше слова. Во-вторых, что вложенные скобки, такие как '[ad cd [ad]] ad', и вы хотите заключить« объявление »? –

+0

Как 'zss' в вашем списке относится к' zsse' в вашем примере? Это опечатка, или вы действительно хотите сделать префиксный матч? –

ответ

-1

Вы можете попробовать это:

In [48]: eentities = ['blab', 'r1', 'zss'] 

In [49]: s = 'this r1 is about zsse' 

In [50]: import re 

In [52]: rs = re.compile('|'.join(eentities)) 

In [60]: sl = list() 

for se in s.split(): 
    if(rs.match(se)): 
     sl.append('[{0}]'.format(se)) 
    else: 
     sl.append(se) 

In [62]: sl 
Out[62]: ['this', '[r1]', 'is', 'about', '[zsse]'] 

In [63]: ' '.join(sl) 
Out[63]: 'this [r1] is about [zsse]' 
+2

Это более сложная версия того, что OP уже имеет. – usr2564301

+0

ОП утверждает, что его решение не работает! И из предложенных решений этот использует одиночный цикл, чем несколько циклов. – Abbas

+1

Да, скорее, просто отправляя большой раздел совершенно нового кода (даже не объясняя это), почему бы не проанализировать их код, рассказать им, что они сделали неправильно и как его исправить. – Druzion

0

Если вас интересует только если entities являются подстроки слов в предложениях, то вы не Не нужно использовать регулярные выражения.

sentences = ['this r1 is about zsse', '[blablab r1 blabala]'] 
entities = ['blab', 'r1', 'zss'] 
new_sentences = [] 

for sentence in sentences: 
    if sentence.startswith('[') and sentence.endswith(']'): 
     new_sentences.append(sentence) 
     continue 

    sentence = sentence.split(' ') 

    for index, word in enumerate(sentence): 
     for entity in entities: 
      if entity in word: 
       sentence[index] = '[{w}]'.format(w=word) 

    new_sentences.append(' '.join(sentence)) 

print new_sentences 
>>> ['this [r1] is about [zsse]', '[blablab r1 blabala]'] 
0

Попробуйте этот код:

import re 

entities = ['blab', 'r1', 'zss'] 
sentences = ['this r1 is about zsse', 'this [r1] is about [zss]e'] 
new_sentences = [] 

for s in sentences: 
    for e in entities: 
     if re.search(r"\[%s\]" % e, s): 
      pass 
     else: 
      s=s.replace(e,'['+e+']') 
    new_sentences.append(s) 

print(new_sentences) 
# >>> ['this [r1] is about [zss]e', 'this [r1] is about [zss]e'] 

Demo on Ideone

Единственная проблема с кодом был new_sentences.append(s) был отступом слишком далеко. new_sentences был .append ed каждый раз entities был забит. Поэтому для каждого sentence было 3 new_sentences.

Вы также, казалось, все, как [[]] или \[\[\]\] вместо [] или \[\]

2

Это, как я бы это сделать. Обратите внимание, что я использую два различных регулярных выражений:

  • (\[.*?]) опознает регионы внутри скобок уже
  • '({})'.format('|'.join(entities)) совпадает с любым из объектов внутри не-квадратные скобки регионов.
import re 

brackets = re.compile(r'(\[.*?])') 
def rewrite(sentence, entities): 
    sentence = brackets.split(sentence) 
    entities = re.compile('({})'.format('|'.join(entities))) 
    for i, phrase in enumerate(sentence): 
     if not phrase.startswith('['): 
      sentence[i] = entities.sub(r'[\1]', phrase) 
    sentence = ''.join(sentence) 
    return sentence 

print rewrite('this r1 is about zsse', ['blab', 'r1', 'zss']) 
print rewrite('[ blablab r1 blabala ]', ['blab', 'r1', 'zss']) 

Результат:

$ python x.py 
this [r1] is about [zss]e 
[ blablab r1 blabala ] 
Смежные вопросы