Определите конкретный шаблон в файле .c или текстовых файлах, используя регулярные выражения python и re.compile - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть файл данных, как показано ниже, и мне нужно извлечь все данные в виде V_AD_bs_NOut_Errs = V_AD_bs_NOut_Errs & C_SD_bs_NOxOut_Mask; . но у меня есть регулярное выражение: ^[a-zA-Z]*_bs_[a-zA-Z0-9] [=] [a-zA-Z]_bs_[a-zA-Z0-9]*[ ] | [a-zA-Z0-9_]*_bs_[a-zA-Z0-9_;]*|;$'

Может кто-нибудь помочь. Я новичок в этом и не совсем уверен, как это получить.

ниже приведен пример данных.


  if ((T_ATM_bs_Enbl & 4194304U) > 0U) {

       */
      P_AD_bs_NO_Out_Errs = P_AD_bs_NO_Out_Errs & C_SCD_bs_NO_Out_Mask;


      V_AD_bs_NOut_Errs = V_AD_bs_NOut_Errs & C_SD_bs_NOxOut_Mask;
    }

      rtb_RelationalOperator_im = ((V_ATD_bs_NOx_Out_Errs &
        C_SCD_bs_NOx_Out_NOxHtrMonMask) > 0U);



        V_SCD_bs_NOtMap = V_SCD_bs_Map | tmp;
      }

        V_1_bs_NO_End = ~(1 << ((uint16_T)
         SENSOR_HTR_RESP_ERR_BIT)) & V_bs_NO_Enbled;

       V_1_bs_NO_End = ~(1 << ((uint16_T)
         SENSOR_HTR_RESP_ERR_BIT)) & V_bs_NO_Enbled;  

       V_1_bs_NO_End = ~(1 << ((uint16_T)
         SENSOR_HTR_RESP_ERR_BIT)) & V_bs_NO_Enbled;

errors = []
linenum = 0
pattern = re.compile('^[a-zA-Z]*_bs_[a-zA-Z0-9] [=] [a-zA-Z]_bs_[a-zA-Z0-9]*[ ](&)[ ]|[a-zA-Z0-9_]*_bs_[a-zA-Z0-9_;]*', re.MULTILINE)
with open('test2.c','rt') as myfile:
    for line in myfile:
        linenum+=1
        if pattern.search(line) != None:
            errors.append((linenum,line.rstrip('\n')))
    for err in errors:
        print("Line " +str(err[0]) + ":" +err[1])
        ```

1 Ответ

0 голосов
/ 04 апреля 2019

Я думаю, что вы только что описали свое регулярное выражение в этом комментарии выше. Если хочешь

V_str_bs_str1 = V_str_bs_str1 & C_str2_bs_str3 ;

тогда ваше регулярное выражение будет выглядеть как

V_\w+_bs_\w+ = V_\w+_bs_\w+ & C_\w+_bs_\w+ ;

Обычно, где бы у вас не было str, замените его на \w+. Однако для этого требуется ровно один пробел между каждым элементом. Это не должно быть правдой для кода c. Таким образом, чтобы сопоставить фигуры с дополнительным или ненадежным интервалом, замените пробел выше на \s+, чтобы соответствовать хотя бы одному пробелу. Я также добавил соответствующие пробелы в начале и конце строки.

^\s*V_\w+_bs_\w+\s+=\s+V_\w+_bs_\w+\s+&\s+C_\w+_bs_\w+\s*;\s*$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...