2016-11-05 3 views
1

Я пытаюсь сопоставить некоторые слова с регулярным выражением и написал для этого код для python. Странно, что re.findall() возвращает пустой список по совпадениям. Тем не менее, шаблон и текстовый файл отображаются в regxr.com. Вот кодPython re.findall() возвращающий пустой список

pat1 = '(\S+)_(?:JJ)_\S+\b(?:\s+)(\S+)_(?:NN|NNS)_\S+\b' 
pat2 = '(\S+?)_(?:RR|RBR|RBS)_\S+\b(?:\s+)(\S+?)_(?:JJ)_\S+\b(?:\s+)(?!\S*?_(?:NN|NNS)_\S+\b)' 
pat3 = '(\S+?)_(?:JJ)_\S+\b(?:\s+)(\S+?)_(?:JJ)_\S+\b(?:\s+)(?!\S*?_(?:NN|NNS)_\S+\b)' 
pat4 = '(\S+?)_(?:NN|NNS)_\S+\b(?:\s+)(\S+?)_(?:JJ)_\S+\b(?:\s+)(?!\S*?_(?:NN|NNS)_\S+\b)' 
pat5 = '(\S+?)_(?:RB|RBR|RBS)_\S+\b(?:\s+)(\S+?)_(?:VB|VBD|VBN|VBG)_\S+\b(?:\s+)\S*?_\S+?_\S+\b' 

def process_file(content): 
res = [] 
for line in content: 
    matches = re.findall(pat1,line) 
    for m in matches: 
     m = (m[0],m[1]) 
     phrase = '%s %s' % m 
     res.append(phrase) 
    matches = re.findall(pat2,line) 
    for m in matches: 
     m = (m[0],m[1]) 
     phrase = '%s %s' % m 
     res.append(phrase) 
    matches = re.findall(pat3,line) 
    for m in matches: 
     m = (m[0],m[1]) 
     phrase = '%s %s' % m 
     res.append(phrase) 
    matches = re.findall(pat4,line) 
    for m in matches: 
     m = (m[0],m[1]) 
     phrase = '%s %s' % m 
     res.append(phrase) 
    matches = re.findall(pat5,line) 
    for m in matches: 
     m = (m[0],m[1]) 
     phrase = '%s %s' % m 
     res.append(phrase) 
return res 

def main(path): 
    contents = [] 
    f = open(path) 
    for line in f: 
     contents.append(line) 
    f.close() 
    result = process_file(contents) 
    print result 

Это текстовый файл, я использую:

sydney_NN_B-NP lumet_NN_I-NP is_VBZ_B-VP the_DT_B-NP director_NN_I-NP whose_WP $ _B-NP work_NN_I-NP happens_VBZ_B -VP to_TO_I-VP be_VB_I-VP of_IN_B-PP vary_VBN_B-NP quality_NN_I-NP ._._ B-O he_PRP_B-NP is_VBZ_B-VP praised_VBN_I-VP для_IN_B-PP some_DT_B-NP of_IN_B-PP the_DT_B-NP most_RBS_I-NP important_JJ_I- NP films_NNS_I-NP of_IN_B-PP the_DT_B-NP previous_JJ_I-NP years_NNS_I-NP, _, _ B-O like_IN_B-PP twelve_CD_B-NP angry_JJ_I-NP men_NNS_I-NP, _, _ B-O serpico_NN_B-NP or_CC_B-O the_DT_B-NP verdict_NN_I -NP ._._ B-O but_CC_B-O, _, _ I-O in_IN_B-PP the_DT_B-NP same_JJ_I-NP time_NN_I-NP, _, _ B-O почти_RB_B-NP any_DT_I-NP of_IN_B-PP такой_JJ_B-NP pearls_NNS_I-NP is_VBZ_B-VP follow_VBN_I-VP by_IN_B -PP stinkers_NNS_B-NP that_WDT_B-NP hamper_VBP_B-VP lumet's_JJ_B-NP репутация_NN_I-NP ._._ B-O a_DT_B-NP stranger_NN_I-NP среди_IN_B-PP us_PRP_B-NP, _, _ B-O 1992_CD_B-NP rip-off_NN_I -NP of_IN_B-PP peter_NN_B-NP weir's_JJ_I-NP witness_NN_I-NP, _, _ B-O принадлежит_VBZ_B-VP to_TO_B-PP the_DT_B-NP last_NN_I-NP category_NN_I-NP ._._ B-O the_DT_B-NP heroine_NN_I-NP of_IN_B-PP this_D__-NP__N__-NP___B__B_P_N___N___N___N___-NP__N__-NP___-NP____-NP__-NP-_____-NP__-NP___-NP__-NP__-NP-_ who_WP_B-NP иногда_RB_B-ADVP показывает_VBZ_B-VP too_RB_B-NP much_JJ_I-NP энтузиазм_NN_I-NP in_IN_B-PP battling_VBG_B-VP bad_JJ_B-NP guys_NNS_I -NP on_IN_B-PP the_DT_B-NP street_NNS_I-NP of_IN_B-PP new_JJ_B-NP york_NN_I-NP ._._ B-O in_IN_B-PP one_CD_B-NP of_IN_B-PP такой_JJ_B-NP action_NNS_I-NP, _, _ B-O her_PRP $ _B-NP partner_NN_I-NP nick_NN_I-NP (_ (_ B-O jamey_JJ_B-NP sheridan_NNS_I-NP) _) _ B-O got_VBD_B-VP hurt_VBN_I-VP и_CC_B-O as_IN_B-PP a_DT_B-NP result_NN_I-NP, _, _ B- O she_PRP_B-NP становится _VBZ_B-VP depressed_JJ_B-ADJP ._._ B-O in_IN_B-PP order_NN_B-NP to_TO_B-VP help_VB_I-VP her_PRP_B-NP recover_VB_B-VP, _, _ B-O bosses_NNS_B-NP give_VBP_B-VP her_PRP_B-NP rather_RB_I-НП easy_JJ_I-НП task_NN_I-НП of_IN_B-ПП locating_VBG_B-ВП missing_VBG_B-НП jeweller_NNS_I-НП who_WP_B-НП belonged_VBD_B-ВП to_TO_B-ПП hassidic_JJ_B-НП jew_NN_I-НП community_NN_I-НП ._._ Б-О emily_NN_B-НП starts_VBZ_B -VP research_NN_B-NP и_CC_B-O soon_RB_B-VP realizes_VBZ_I-VP that_IN_B-SBAR the_DT_B-NP case_NN_I-NP включает_VBZ_B-VP kill_NN_B-NP ._._ B-O concluding_VBG_B-ВП that_IN_B-SBAR the_DT_B-НП perpetrator_NN_I-НП belongs_VBZ_B-ВП to_TO_B-ПП community_NN_B-Н.П., _, _ Б-О she_PRP_B-НП decides_VBZ_B-ВП to_TO_I-ВП go_VB_I-ВП undercover_JJ_B-ADJP ._._ Б-О that_DT_B-NP isn't_RB_B-O easy_JJ_B-ADJP, _, _ B-O потому что_IN_B-SBAR her_PRP $ _B-NP modern_JJ_I-NP manners_NNS_I-NP is_VBP_B-VP colliding_VBG_I-VP with_IN_B-PP традиционный_NN_B-NP way_NNS_I-NP ._._ B -O things_NNS_B-НП get_VBP_B-ВП-НП even_RB_B more_RBR_B-ADJP complicated_JJ_I-ADJP when_WRB_B-ADVP she_PRP_B-НП develops_VBZ_B-ВП feelings_NNS_B-НП for_IN_B-ПП young_JJ_B-НП cabalistic_JJ_I-НП scholar_NN_I-НП ariel_NN_I-НП (_ (_ B- O eric_JJ_B-NP thal_NN_I-NP) _) BO. ._I-O using_VBG_B-VP peter_NN_B-NP weir's_JJ_I-NP formula_NN_I-NP не _: _ B-O the_DT_B-NP наибольший_JJS_I-NP flaw_NN_I-NP of_IN_B-PP this_DT_B-NP film_NN_I-NP ._._ B- О even_RB_B-НП the_DT_I-НП lame_JJ_I-НП and_CC_I-НП unispiring_JJ_I-НП crime_NN_I-НП mystery_NN_I-НП subplot_NN_I-НП works_VBZ_B-ВП to_TO_B-ПП the_DT_B-НП certain_JJ_I-НП extent_NN_I-НП ._._ Б-О but_CC_B- O the_DT_B-NP худший_JJS_I-NP insult_NN_I-NP to_TO_B-PP зритель_JJ_B-NP аудитория_NN_I-NP is_VBZ_B-VP ужасный_JJ_B-NP miscasting_NN_I-NP of_IN_B-PP melanie_JJ_B-NP griffith_NN_I-NP ._._B-O the_DT_B-NP автор_NN_I-NP of_IN_B-PP this_DT_B-NP review_NN_I-NP never_RB_B-ADVP понравился_VBD_B-VP this_DT_B-NP actress_NN_I-NP very_RB_B-ADVP much_RB_I-ADVP, _, _ B-O but_CC_I-O she_PRP_B-NP was_VBD_B -VP at_IN_B-ADVP less_JJS_I-ADVP tolerable_JJ_B-ADJP in_IN_B-PP some_DT_B-NP of_IN_B-PP her_PRP $ _B-NP role_NNS_I-NP ._._ B-O role_NN_B-NP of_IN_B-PP emily_JJ_B-NP eden_NNS_I-NP, _, _B-O К сожалению_RB_B-ADVP, _, _ B-O isn't_VBZ_I-O one_CD_B-NP of_IN_B-PP them_PRP_B-NP ._._ B-O first_RB_B-ADVP of_IN_B-PP all_DT_B-NP, _, _ B-O she_PRP_B- NP can't_MD_B-VP pass_VB_I-VP for_IN_B-PP tough_JJ_B-NP nypd_JJ_I-NP street_NN_I-NP fighter_NN_I-NP, _, _ B-O и_CC_I-O her_PRP $ _B-NP попытка_NN_I-NP to_TO_B-VP pass_VB_I-VP для_IN_B-PP orthodox_JJ_B-NP jewish_JJ_I-NP woman_NN_I-NP isn't_RB_B-O much_RB_B-ADJP better_JJR_I-ADJP ._._ B-O screenplay_NN_B-NP by_IN_B-PP robert_JJ_B-NP j_NN_I -NP ._._ B-O avrech_NNS_B-NP делает_VBZ_B-VP things_NNS_B-NP even_RB_B-ADJP хуже_JJR_I-ADJP with_IN_B-PP some_DT_B-NP formulaic_JJ_I-NP red_JJ_I-NP herring_NN_I-NP subplots_NNS_I-NP (_ (_ B-O scene_NN_B-NP с участием_VBG_B-VP two_CD_B-NP. gangsters_NNS_I-NP был_VBD_B-VP почти_RB_B-ADJP too_RB_I-ADJP painful_JJ_I-ADJP to_TO_B-VP watch_VB_I-VP) _) BO. ._I-O but_CC_B-O, _, _ I-O on_IN_B-PP the_DT_B-NP other_JJ_I-NP hand_NN_I-NP, _, _ B-O other_JJ_B-NP players_NNS_I-NP are_VBP_B-VP more_RBR_B-ADJP convincing_JJ_I-ADJP (_ (_B-O lee_NN_B-NP richardson_NN_I-NP as_IN_B-PP an_DT_B-NP old_JJ_I-NP rabbi_NN_I-NP, _, _ B-O thal_JJ_B-ADJP as_IN_B-PP ariel_NN_B-NP и_CC_B-O charming_JJ_B-NP mia_NN_I-NP sara_NN_I-NP as_IN_B -PP his_PRP $ _B-NP intended_VBN_I-NP bride_NN_I-NP) _) BO,, _I-O-O and_CC_I the_DT_B-NP photography_NN_I-NP by_IN_B-PP andrzej_JJ_B-NP bartkowiak_NN_I-NP very_RB_B-ADVP effectively_RB_I-ADVP creates_VBZ_B- VP atmosphere_NN_B-NP of_IN_B-PP warmth_NN_B-NP при_WRB_B-ADVP the_DT_B-NP scenes_NNS_I-NP take_VBP_B-VP place_NN_B-NP in_IN_B-PP hassidic_JJ_B-NP community_NN_I-NP ._._ B-O also_RB_B-ADVP, _, _ B-O the_DT_B-NP film_NN_I-NP may_MD_B-VP educate_VB_I-VP views_NNS_B-NP about_IN_B-PP hassidic_JJ_B-NP culture_NN_I-NP ._._ B-O that_DT_B-NP is_VBZ_B-VP the_DT_B-NP only_JJ_I-NP thing_NN_I-NP that_WDT_B-NP предотвращает_VBZ_B-VP it_PRP_B-NP из_IN_B-PP turn_VBG_B-VP в_IN_B-PP total_JJ_B-NP waste_NN_I -NP of_IN_B-PP time_NN_B-NP ._._ B-O

ответ

2

Вы укусаны спиной косой чертой! Обратная косая черта используется как escape-символ в строках Python (как на многих других языках). Например, \n означает «новая линия» и \r означает «возврат каретки» ... и \b означает «backspace», aka \x08.

И у вас есть \b во всех ваших выражениях.

Так что, когда вы пишете:

>>> pat1 = '...\b...' 

Вы получаете:

>>> pat1 
'...\x08...' 

Есть два способа исправить это.Вы можете избежать каждый обратный слэш с другой обратной косой черты, например:

>>> pat1 = '...\\b...' 
>>> pat1 
'...\\b...' 

И заметьте, что вы видите \\ там, потому что это представление Python строки; если мы должны были распечатать pat1 мы получаем:

>>> print pat1 
...\b... 

Чем проще способ исправить это, чтобы отметить вам регулярные строки выражения, как «сырые нити»:

обратной косой черты() используется символ для которые в противном случае имеют особое значение, например, символ новой строки, обратную косую черту или символ кавычки. Строковые литералы необязательно могут иметь префикс с буквой r' or R '; такие строки называются необработанными строками и используют разные правила для escape-последовательностей обратной косой черты.

Другими словами:

pat1 = r'(\S+)_(?:JJ)_\S+\b(?:\s+)(\S+)_(?:NN|NNS)_\S+\b' 
pat2 = r'(\S+?)_(?:RR|RBR|RBS)_\S+\b(?:\s+)(\S+?)_(?:JJ)_\S+\b(?:\s+)(?!\S*?_(?:NN|NNS)_\S+\b)' 
pat3 = r'(\S+?)_(?:JJ)_\S+\b(?:\s+)(\S+?)_(?:JJ)_\S+\b(?:\s+)(?!\S*?_(?:NN|NNS)_\S+\b)' 
pat4 = r'(\S+?)_(?:NN|NNS)_\S+\b(?:\s+)(\S+?)_(?:JJ)_\S+\b(?:\s+)(?!\S*?_(?:NN|NNS)_\S+\b)' 
pat5 = r'(\S+?)_(?:RB|RBR|RBS)_\S+\b(?:\s+)(\S+?)_(?:VB|VBD|VBN|VBG)_\S+\b(?:\s+)\S*?_\S+?_\S+\b' 

С учетом этого изменения в месте, я получаю матчи с помощью данных выборки:

>>> re.findall(pat1, data) 
[('important', 'films'), ('previous', 'decades'), ('angry', 'men'), ('same', 'time'), ('such', 'pearls'), ("lumet's", 'reputation'), ("weir's", 'witness'), ('melanie', 'griffith'), ('tough', 'lady'), ('much', 'enthusiasm'), ('bad', 'guys'), ('new', 'york'), ('such', 'actions'), ('jamey', 'sheridan'), ('easy', 'task'), ('hassidic', 'jew'), ('modern', 'manners'), ('cabalistic', 'scholar'), ('eric', 'thal'), ("weir's", 'formula'), ('unispiring', 'crime'), ('certain', 'extent'), ("viewer's", 'audience'), ('terrible', 'miscasting'), ('melanie', 'griffith'), ('emily', 'eden')] 
+0

Спасибо большое. Это сработало. –

Смежные вопросы