Python 如何使用正则表达式区分出现次数不同的相同模式?
我想知道如何区分不同列数的行。 例如:Python 如何使用正则表达式区分出现次数不同的相同模式?,python,regex,bash,grep,Python,Regex,Bash,Grep,我想知道如何区分不同列数的行。 例如: 100.00000 150.00000 18.1170 998.00 575.31 -1318.75 575.31 预期结果是返回第1行或第2行,但不是同时返回这两行。 表达式应该认识到第一行有两个浮点,第二行由五个任意长度的浮点组成,中间有任意数量的空格 python(或其他任何语言)的解决方案是拆分行并计算列表中的元素,但我想知道是否可以编写一个表达式来标识不同列数的行 我尝试了\d+\.\d+,但这显
100.00000 150.00000
18.1170 998.00 575.31 -1318.75 575.31
预期结果是返回第1行或第2行,但不是同时返回这两行。表达式应该认识到第一行有两个浮点,第二行由五个任意长度的浮点组成,中间有任意数量的空格 python(或其他任何语言)的解决方案是拆分行并计算列表中的元素,但我想知道是否可以编写一个表达式来标识不同列数的行 我尝试了
\d+\.\d+
,但这显然不会影响不同列数的行
我也尝试过类似的方法(如空格数字空格数字掩码):
这也不是我想要的
或者使用组
(\d+\.[0-9]+\s)+
此正则表达式查找小于或大于5个值的行
^[\t ]*(?:(?:-?[\d.]+[\t ]*){0,4}|(?:-?[\d.]+[\t ]+){5}[-\d.].*)$
说明:
^
。。。在行首开始每次搜索
[\t]*
。。。在行首匹配0个或多个制表符或空格
在此处使用\s
是不好的,因为此字符类与任何包含换行符、回车符和换行符的空白字符匹配,并且搜索表达式不应与跨越多行的字符串匹配
(?:
…|
…)
。。。非捕获组中的或表达式
OR表达式的第一个参数用于查找具有0到4个值的行。
(?:
…){0,4}
。。。圆括号内的表达式必须至少匹配0次,但不超过4次
-?
。。。匹配可选的现有连字符(用作减号)
[\d.]+[\t]*
。。。匹配任意数字或点1次或多次,每次后接0或更多制表符或空格
或表达式的第二个参数用于查找具有6个或更多值的行。
(?:
…){5}
。。。圆括号内的表达式必须精确匹配5次
-?
。。。匹配可选的现有连字符(用作减号)
[\d.]+[\t]+
。。。匹配任意数字或点1次或多次,每次后接1或更多制表符或空格
[-\d.].
。。。匹配连字符,或任何数字或点和0或更多字符,直到行尾。如果在5个值之后至少有1个其他值字符,则该行肯定包含5个以上的值
$
。。。匹配的字符串必须在行尾(或文件结尾)结束
表达式也要匹配行终止
以下扩展表达式也可用于匹配DOS/Windows(回车+换行)或UNIX(仅换行)或MAC(仅回车)类型的行终止,如果该行的值数目错误,则应将其从文件中完全删除
^[\t ]*(?:(?:-?[\d.]+[\t ]*){0,4}|(?:-?[\d.]+[\t ]+){5}[-\d.].*)$(?:\r?\n|\r)?
如果这一行没有行终止,并且文件末尾的这个字符串不正好有5个浮点值,那么这3种类型的行终止的非捕获或表达式后的问号也会导致匹配文件的最后一行
查找正好有5个浮点值的行:
对于完整性,查找正好有5个值的线则相反:
^[\t ]*(?:-?[\d.]+[\t ]+){4}-?[\d.]+[\t ]*$
或使用匹配的行终止(或仅文件末尾的5个值):
但是如果tab/空格分隔的值文件包含
100.0000 150.0000
100.0000 150.0000 200.0000
18.1170 998.00 575.31 -1318.75 575.31
-54.1270 -13.20 8.45 27.7564 9863.6246
-2.84 7520.8843 -74.8305 340.4149 237.7302
935.224 738.720 942.9 270.0034 8.3053 2943.20
而任务就是标记
- 每行带有感叹号,与下一行相比具有不同数量的浮点值
- 与文件中的下一行以及最后一行相比,每行的浮点数相等
! 100.0000 150.0000
! 100.0000 150.0000 200.0000
= 18.1170 998.00 575.31 -1318.75 575.31
= -54.1270 -13.20 8.45 27.7564 9863.6246
! -2.84 7520.8843 -74.8305 340.4149 237.7302
= 935.224 738.720 942.9 270.0034 8.3053 2943.20
仅使用一个正则表达式,答案是:
这是不可能的。为什么要强迫自己的想法使用正则表达式?我认为你不会比len(split(line))做得更好。@PaulMcGuire-我在问题中写道,我有这样一个解决方案,我对regex方式感兴趣,如果有的话。好奇是不对的吗?@EdMorton我对regex很感兴趣,如果这个问题有解决办法的话。这些行来自随机文件,前两行是否存在并不重要。我想这很清楚,我想知道regex是否能区分第1行和第2行与第3行和第4行。我也想知道为什么要投反对票?“问题的哪一方面没有实现?”埃德蒙顿-谢谢你,埃德,我试图简化这个问题,希望它更清楚。“是”的回答很好,但可能没有什么用处:)谢谢你@Mofi的透彻回答和总结<代码>^[\t]*(?:-?[\d.]+[\t]+){2,}-?[\d.]+[\t]*$将匹配示例的第二行(两个以上的浮点)
100.0000 150.0000
100.0000 150.0000 200.0000
18.1170 998.00 575.31 -1318.75 575.31
-54.1270 -13.20 8.45 27.7564 9863.6246
-2.84 7520.8843 -74.8305 340.4149 237.7302
935.224 738.720 942.9 270.0034 8.3053 2943.20
! 100.0000 150.0000
! 100.0000 150.0000 200.0000
= 18.1170 998.00 575.31 -1318.75 575.31
= -54.1270 -13.20 8.45 27.7564 9863.6246
! -2.84 7520.8843 -74.8305 340.4149 237.7302
= 935.224 738.720 942.9 270.0034 8.3053 2943.20