regex 设置不接受某些特定符号的字母数字正则表达式模式

xjreopfe  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(132)
import re

#Examples:
input_text = "Recien el 2021-10-12 despues de 3 dias 2021-10-12" #NOT PASS
input_text = "Recien el 2021-10-12 hsah555sahsdhj. Ya despues de 3 dias hjsdfhjdsfhjdsf 2021-10-12" #NOT PASS
input_text = "Recien el 2021-10-12 hsah555sahsdhj; despues de 3 dias hjsdfhjdsfhjdsf 2021-10-12" #NOT PASS
input_text = "Recien el 2021-10-12 hsah555sahsdhj despues de 3 dias hjsdfhjdsfhjdsf.\n 2021-10-12" #NOT PASS
input_text = "Recien el 2021-10-12 hsah555sahsdhj; mmm... creo que ya despues de 3 dias hjsdfhjdsfhjdsf.\n 2021-10-12" #PASS
input_text = "Recien el 2021-10-12 hsah555sahsdhj.    \n\n\n mmm... creo que ya despues de 3 dias hjsdfhjdsfhjdsf.\n 2021-10-12" #PASS

some_text = r"[\s|]*"  # <--- I NEED MODIFY THIS PATTERN
date_format = r"\d*-\d{2}-\d{2}"

check_00 = re.search(date_format + some_text + r"(?:(?:pasados|pasado|despues del|despues de el|despues de|despues|tras) (\d+) (?:días|día|dias|dia)|(\d+) (?:días|día|dias|dia) (?:pasados|pasado|despues del|despues de el|despues de|despues|tras))", input_text, re.IGNORECASE)
check_01 = re.search(r"(?:(?:pasados|pasado|despues del|despues de el|despues de|despues|tras) (\d+) (?:días|día|dias|dia)|(\d+) (?:días|día|dias|dia) (?:pasados|pasado|despues del|despues de el|despues de|despues|tras))" + some_text + date_format, input_text, re.IGNORECASE)

if not check_00 and not check_01: print("1")
else: print("0")

我需要在变量some_text中设置一个模式,用于标识任何字母数字子字符串(其可能包含所包括的符号,例如:$#&?¿!¡|°,.()][}{),并且可以包含大写和小写字符,但是不应该出现(甚至一次也不应该出现)的符号只有;.\n.[\s|]*\n*
在本例中,我需要确定哪些情况不满足代码中的if not条件。
如果算法中的所有内容都正常工作,您应该得到的输出如下所示:

0  #for example 1
0  #for example 2
0  #for example 3
0  #for example 4
1  #for example 5
1  #for example 6

在我想放入some_text变量的同一模式中,是否可以用我不想出现在该模式的标识区域中的符号(在本例中为;.[\s|]*\n*)来表示一个列表?

nwnhqdif

nwnhqdif1#

但唯一不应该出现的符号,甚至一次都不应该出现,是;和.\n或.[\s| ]*\n *
如果不允许使用;,可以简单地使用[^;]
关于另外两种"模式":[\s|]模式做出了错误的假设:字符类中的竖线符号将被解释为 * literally *。看起来你想用它来表明\s是可选的,但是星号已经确保了这一点。必须对点进行转义。所以\.\s*?\n。但是要 * 不 * 允许它,你可以将它放在一个负的前瞻中:(?!\.\s*?\n).
这导致:

some_text = r"(?:(?!\.\s*?\n)[^;])*"

相关问题