regex 为什么这个正则表达式模式无法匹配给定的字符串,如何纠正它?

5ktev3wc  于 2023-01-10  发布在  其他
关注(0)|答案(1)|浏览(149)

我想捕获所有字符使用pythonregex满足下面描述的三个条件之一
~表示零个或多个字符)
[模式1] NAME_“单词或数字”AGE_my_num ~;
[模式2] NAME_“单词或数字”DESC_my_num ~;
[模式3] NAME_ADD_“单词或数字”CHAR_DESC_ADD_单词或数字或下划线描述符my_num ~;
对于[pattern 1]、[pattern 2]、[pattern 3],我希望只查找**与给定my_num**匹配的文本。例如,下面的示例表明我选择了373和416作为my_num值。
(Note每个模式可以包含多行字符)
原文:

NAME_ "Hello" AGE_ 373 0;
NAME_ "Summer" AGE_ 340 0;
NAME_ "Sam" AGE_ 416 14;
NAME_ "Edward" DESC_ 373 ABC_DEF_G "These are users.

age, description

- example(0x15) , Isfalse : 0xF+df

- safe.

- (t) = + 1";
NAME_ "Alex" DESC_ 373 asdf 65535;
NAME_ADD_ "Crystal" CHAR_DESC_ADD_ GGE_R DESC_ 373 ABCD 340;
NAME_ "Ray" DESC_ 111 asdfs 3;
NAME_ "Brown" DESC_ 416 asdfs 3;
NAME_ADD_ "Hailey" CHAR_DESC_ADD_ GGE3 DESC_ 416 ABCD 120;
NAME_ "Watson" AGE_ 373 0;
NOT_NAME_ 324 XYZ 22 "A" 1 "B" 2 "C" 3 "R" ;

预期输出:

NAME_ "Hello" AGE_ 373 0;
NAME_ "Sam" AGE_ 416 14;
NAME_ "Edward" DESC_ 373 ABC_DEF_G "These are users.

age, description

- example(0x15) , Isfalse : 0xF+df

- safe.

- (t) = + 1";
NAME_ "Alex" DESC_ 373 asdf 65535;
NAME_ADD_ "Crystal" CHAR_DESC_ADD_ GGE_R DESC_ 373 ABCD 340;
NAME_ "Brown" DESC_ 416 asdfs 3;
NAME_ADD_ "Hailey" CHAR_DESC_ADD_ GGE3 DESC_ 416 ABCD 120;
NAME_ "Watson" AGE_ 373 0;

我试过使用regex像(与re.findall方法):

(?s)((NAME_ .+ (AGE_|DESC_) (373|416) .?(?=NAME_|NOT_NAME_|$))|(NAME_ADD_ .+ CHAR_DESC_ADD_ .+ DESC_ (373|416) .?(?=NAME_|NOT_NAME_|$)))

但它什么也没捕捉到。我的尝试有什么问题,如何才能正确地做到这一点?

rta7y2nd

rta7y2nd1#

我看到的正则表达式的主要问题是,您只匹配my_num后面的空格和单个可选字符。在您的原始文本中,没有与此匹配的序列,因此结果为空。此外,.+应该更改为排除;字符。否则,正则表达式可以匹配整个文件,只要前几个和最后几个字符一起匹配其中一个模式。
您可以将.+更改为[^;]+,将my_num之后的.?更改为[^;]*;[^;]匹配任何非;的字符。此外,如果您这样做,则不需要前瞻Assert(?=NAME_|NOT_NAME_|$)。新的正则表达式可能如下所示:

(?s)((NAME_ [^;]+ (AGE_|DESC_) (373|416) [^;]*;)|(NAME_ADD_ [^;]+ CHAR_DESC_ADD_ [^;]+ DESC_ (373|416) [^;]*;))

相关问题