2016-03-27 5 views
2

Я пробовал сопоставлять слова, включая букву «ab» или «ba», например. «ab», f «ab» rics, pro «ba». Я придумал следующее регулярное выражение:python regex соответствие словам «ab» или «ba»

r"[Aa](?=[Bb])[Bb]|[Bb](?=[Aa])[Aa]" 

Но он включает в себя слова, которые начинаются или заканчиваются», (,),/.... не буквенно-цифровые символы Как я могу удалить его, я просто хочу.? чтобы соответствовать списку слов.

import sys 
import re 

word=[] 

dict={} 

f = open('C:/Python27/brown_half.txt', 'rU') 
w = open('C:/Python27/brown_halfout.txt', 'w') 

data = f.read() 
word = data.split() # word is list 

f.close() 

for num2 in word: 
    match2 = re.findall("\w*(ab|ba)\w*", num2) 
    if match2: 
     dict[num2] = (dict[num2] + 1) if num2 in dict.keys() else 1 

for key2 in sorted(dict.iterkeys()):print "%s: %s" % (key2, dict[key2]) 
print len(dict.keys()) 

Здесь, я не знаю, как смешивать его с «re.compile» ~~ метод, который первый комментарий сказал ...

+5

Учителя должны перестать говорить, что регулярные выражения являются решением любой проблемы, известной человечеству ... – 3442

+0

@KemyLand: Это должен быть принятый ответ :) – Jan

ответ

0
string = "your string here" 
lowercase = string.lower() 
if 'ab' in lowercase or 'ba' in lowercase: 
    print(true) 
else: 
    print(false) 
2

чтобы соответствовать всем слова с ab или ba (без учета регистра):

import re 

text = 'fabh, obar! (Abtt) yybA, kk' 
pattern = re.compile(r"(\w*(ab|ba)\w*)", re.IGNORECASE) 

# to print all the matches 
for match in pattern.finditer(text): 
    print match.group(0) 

# to print the first match 
print pattern.search(text).group(0) 

https://regex101.com/r/uH3xM9/1

+1

В этом случае нечувствительный или ** чувствительный **? ... Он не будет соответствовать «Ablotion»! ... Чтобы сделать его нечувствительным к регистру, добавьте 're.IGNORECASE флаг. –

+0

Я пробовал ваш, но он по-прежнему соответствует этим. , все еще содержит знаки препинания и специальные символы. e.x. "Отказались: 1 " незаменимо: 1 "возможно: 1 " не удалось: 1 (полузащитник: 1 2-Baser ,: 1banker .: 1 банкиров: 2 банковских ,: 1 банкиров .: –

+0

есть любой способ распечатать группу 1, в методе re.search? –

1

Регулярные выражения не являются лучшим инструментом для работы в этом случае. Для таких простых обстоятельств они слишком усложняют ситуацию. Вместо этого вы можете использовать встроенный in оператор Питона (работает как Python 2 и 3) ...

sentence = "There are no probable situations whereby that may happen, or so it seems since the Abolition." 
words = [''.join(filter(lambda x: x.isalpha(), token)) for token in sentence.split()] 

for word in words: 
    word = word.lower() 
    if 'ab' in word or 'ba' in word: 
     print('Word "{}" matches pattern!'.format(word)) 

Как вы можете видеть, 'ab' in word вычисляет True, если строка 'ab' найдена как есть (то есть, точно) в word, или False в противном случае. Например, 'ba' in 'probable' == True и 'ab' in 'Abolition' == False. Вторая строка берет на себя необходимость деления предложения на слова и снятия любого символа пунктуации. word = word.lower() делает word в нижнем регистре перед сравнением, так что для word = 'Abolition', 'ab' in word == True.

+1

Ваши «слова» - это список символов, возможно, вы хотели в своем списке «Понимание» .split() 'вместо этого? –

+0

@ IronFist: я проверил код перед публикацией, но забыл, что при написании ответа. Спасибо, что заметили! – 3442

1

Я хотел бы сделать это следующим образом:

  1. Strip ваша строка от нежелательных символов с использованием ниже двух методов, ваш выбор:

    а - Построение словаря перевода и использование метода translate:

    >>> import string 
    >>> del_punc = dict.fromkeys(ord(c) for c in string.punctuation) 
    s = 'abolition, fabrics, probable, test, case, bank;, halfback 1(ablution).' 
    >>> s = s.translate(del_punc) 
    >>> print(s) 
    'abolition fabrics probable test case bank halfback 1ablution' 
    

    б - с использованием re.sub метода:

    >>> import string 
    >>> import re 
    >>> s = 'abolition, fabrics, probable, test, case, bank;, halfback 1(ablution).' 
    >>> s = re.sub(r'[%s]'%string.punctuation, '', s) 
    >>> print(s) 
    'abolition fabrics probable test case bank halfback 1ablution' 
    
  2. Далее будет найти ваши слова, содержащие «AB» или «ба»:

    а - Нарезка над непечатаемыми и находить вхождение ваших желаемых строк, которая является один я рекомендую вам:

    >>> [x for x in s.split() if 'ab' in x.lower() or 'ba' in x.lower()] 
    ['abolition', 'fabrics', 'probable', 'bank', 'halfback', '1ablution'] 
    

    б -Использование re.finditer метод:

    >>> pat 
    re.compile('\\b.*?(ab|ba).*?\\b', re.IGNORECASE) 
    >>> for m in pat.finditer(s): 
         print(m.group()) 
    
    
    abolition 
    fabrics 
    probable 
    test case bank 
    halfback 
    1ablution 
    
Смежные вопросы