被正则表达式难住了

2024-04-19 02:12:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个文件中有这样的行:

l_12_interval         j_10_int
Length:100         Min.   :-2120803808
Class :character   1st Qu.: -992076064
Mode  :character   Median :  263935522
                   Mean   :  -33801580
                   3rd Qu.:  896644601
                   Max.   : 1890084945
                   NA's   :53

我想解析出我称之为最后一个“主要列”的内容:

   j_10_int
Min.   :-2120803808
1st Qu.: -992076064
Median :  263935522
Mean   :  -33801580
3rd Qu.:  896644601
Max.   : 1890084945
NA's   :53

列将对齐,但我不能确定最后一个主要列将从何处开始。标题不是问题,我正在尝试为Python的re.sub()函数编写一个正则表达式,以除去标签前面的所有内容。我想我可以把标签和冒号作为子表达式包含在正则表达式中,然后用子表达式替换匹配的表达式。说起来容易做起来难!这是我得到的最接近的结果:

>>> line
'       Length:100         Min.   :-2120803808'
>>> re.sub(r"^.*([a-z1-9][a-z1-9.' ]*:)", r"\1", line, re.IGNORECASE)
'n.   :-2120803808'
>>>

我想我可以在子表达式开始前立即抛出一个空格,但这不起作用:

>>> re.sub(r"^.*\s([a-z1-9][a-z1-9.' ]*:)", r"\1", line, re.IGNORECASE)
'       Length:100         Min.   :-2120803808'
>>> re.sub(r"^.* ([a-z1-9][a-z1-9.' ]*:)", r"\1", line, re.IGNORECASE)
'       Length:100         Min.   :-2120803808'
>>> re.sub(r"^.*( [a-z1-9][a-z1-9.' ]*:)", r"\1", line, re.IGNORECASE)
'       Length:100         Min.   :-2120803808'
>>> re.sub(r"^.*(\w[a-z1-9][a-z1-9.' ]*:)", r"\1", line, re.IGNORECASE)
'in.   :-2120803808'

如你所见,我甚至试着在子表达式中拉空格。。。这是可以接受的。但我还没有完全解决问题。你知道吗

有人有什么建议吗?你知道吗


Tags: re内容表达式lineminmeanlengthmax
3条回答

如果您不必使用正则表达式并且列具有固定宽度,那么下面的示例也适用于您。你知道吗

with open("data", "rb") as f:
    for line in f:
        print(line.strip("\n")[19:])

这将输出:

   j_10_int
Min.   :-2120803808
1st Qu.: -992076064
Median :  263935522
Mean   :  -33801580
3rd Qu.:  896644601
Max.   : 1890084945
NA's   :53

Ide不编写python正则表达式。你知道吗

因此,如果这是一个一次性的工作,那么我有一个PerlOneLiner给你。你知道吗

perl -pe 's/^\w++\s++(\w++)/\t$1/||s/.*?\s*+:\s*+\w++\s++(.*)/$1/||s/\s++(.*)/$1/' FILE.txt > NEWFILE.txt

在从文件FILE.txt到文件NEWFILE.txt中生成所需输出的

我希望这是有用的。你知道吗

诀窍是在:之前寻找垃圾,然后是可能的空格和一组单词字符,然后是一些空格。在那之后的一切都是你要找的。你知道吗

我还处理了其他情况,如第一行和剥离一些行的前导空格。你知道吗

这一点基于许多关于名称格式和第一列值格式的假设,但它适用于您的示例:

^(?:[A-Z][a-z]+\s*:[a-z0-9]*|)\s*([A-Z0-9].*)$

根据您对不同名称和值的格式的确切了解,可能需要做更多的工作。你知道吗

演示: http://regex101.com/r/oP3pT2

相关问题 更多 >