我想捕获所有字符使用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_|$)))
但它什么也没捕捉到。我的尝试有什么问题,如何才能正确地做到这一点?
1条答案
按热度按时间rta7y2nd1#
我看到的正则表达式的主要问题是,您只匹配
my_num
后面的空格和单个可选字符。在您的原始文本中,没有与此匹配的序列,因此结果为空。此外,.+
应该更改为排除;
字符。否则,正则表达式可以匹配整个文件,只要前几个和最后几个字符一起匹配其中一个模式。您可以将
.+
更改为[^;]+
,将my_num
之后的.?
更改为[^;]*;
。[^;]
匹配任何非;
的字符。此外,如果您这样做,则不需要前瞻Assert(?=NAME_|NOT_NAME_|$)
。新的正则表达式可能如下所示: