在正则表达式上迭代的Python 3.3版冻结
我试图使用正则表达式匹配文本文件中的一行,但每次调用pattern.finditer(line)时,程序都会冻结。程序的另一部分将文本块传递给formatLine方法。文本格式如下:在正则表达式上迭代的Python 3.3版冻结,python,regex,freeze,Python,Regex,Freeze,我试图使用正则表达式匹配文本文件中的一行,但每次调用pattern.finditer(line)时,程序都会冻结。程序的另一部分将文本块传递给formatLine方法。文本格式如下: line="8,6,14,32,42,4,4,4,3,5,3,3,4,2,2,2,1,2,3,2,1,3,4,2,3,10,false,false,false,false,true,false,false,true,false,false,false,false,false,false,false,false,fa
line="8,6,14,32,42,4,4,4,3,5,3,3,4,2,2,2,1,2,3,2,1,3,4,2,3,10,false,false,false,false,true,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,1,2,1,2,4,"
def formatLine(line):
print(line)
print("----------")
commas=len(line.split(","))
timestamp="(\d+,){5}"
q1="([1-5,]+){20}"
q2="([1-5,]+)"
q3="(true,|false,){10}"
q4="(true,|false,){6}"
q5="(true,|false,){20}"
q6="([1-5,]+){5}"
pattern=re.compile(timestamp+q1+q2+q4+q5)
print("here")
response=pattern.finditer(line)
for ans in response:
numPattern+=1
#write to file for each instance of ans
#these check that the file is valid
print("here")
#more code, omitted
formatLine(line)#call method here
第一个和第二个print语句打印正确,但从未打印“here”一词。有人知道它为什么会冻结和/或我能做些什么来修复它吗
编辑:在阅读了评论之后,我意识到一个更好的问题是:如何改进上面的正则表达式以获得下面的模式?我刚刚开始学习python(昨天),并且反复阅读了python正则表达式教程。
每个值(真或假或数字用逗号分隔)。。。。。我从中提取的文件是CSV
-我试图得到的模式:
([1-5,]+){20}
部分原因。它没有挂起,它只是忙于解决难题:“让我重复N次,重复20次”。您最好用([1-5]+,){20}
之类的东西来替换它,尽管我认为您的方法根本不可行。只需用逗号分割字符串并从列表中分割所需内容
根据您的更新,这似乎是正确的模式:
pattern = r"""(?x)
([0-9], | [1-5][0-9], | 60,) {5} # 5 numbers (each number is 0-60)
([1-5],) {20} # 20 digits (each digit is 1-5)
(true,|false,) {36} # 36 true or false (may be in any arrangement of true or false)
([1-5],) {20} # 20 digits (each digit is 1-5)
"""
当然,这就是csv模块的设计目的,不需要正则表达式:
line="8,6,14,32,42,4,4,4,3,5,3,3,4,2,2,2,1,2,3,2,1,3,4,2,3,10,false,false,false,false,true,false,false,true,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,1,2,1,2,4"
from io import StringIO # this allows the string to act like a file
f=StringIO(line) # -- just use a file
### cut here
import csv
reader=csv.reader(f)
for e in reader:
# then just slice up the components:
q1=e[0:5] # ['8', '6', '14', '32', '42']
q2=e[6:26] # ['4', '4', '3', '5', '3', '3', '4', '2', '2', '2', '1', '2', '3', '2', '1', '3', '4', '2', '3', '10']
q3=e[27:53] # ['false', 'false', 'false', 'true', 'false', 'false', 'true', 'false', 'false', 'false', 'false', 'false', 'false', 'false', 'false', 'false', 'false', 'false', 'false', 'false', 'false', 'false', 'false', 'false', 'false', 'false']
q4=e[54:] # ['2', '1', '2', '4']
然后,您可以根据需要验证每个部分 我建议去掉正则表达式,直接处理
行中的每个单词。split(',')
。是的,这可能会解决它,但我更好奇的是,为什么它一开始就不起作用。我认为正则表达式机制在试图准确计算每种类型的匹配有多少时感到困惑。另外,请注意([1-5,]+){20}
——这20个字符不是字段。我花了10年时间才学会正则表达式:)尝试在时间戳子模式中加倍转义\\d
,或者使用原始字符串r'(\d+,){5}'
(但是你的方法很奇怪)。我不认为它实际上是冻结的,我认为它只是非常,我的目标是将该模式的每个实例从一个可能包含许多未知字符或该模式的格式不正确版本的文件中拉出。我正在努力避免这些。这正是我所需要的!你能解释一下字母r和三个双引号是用来做什么的吗?我意识到这是Python语法,但它们做什么呢?@Rilcon42:r
是一个“原始”字符串文字,三重引号-一个多行字符串:这很有意义。最后一个问题是,当我将模式替换为您建议的模式,然后运行代码时,numPattern保持为0,这意味着它找不到匹配项。更新numPattern的for循环是否出于某种原因不正确?@Rilcon42:问题中的代码不正确(numPattern
未初始化),但如果我们在循环之前假设numPattern=0
,是的,这意味着它没有找到任何东西。