如何在 python 上使用正则表达式、开关和修剪来检索文件中的值?

Posted

技术标签:

【中文标题】如何在 python 上使用正则表达式、开关和修剪来检索文件中的值?【英文标题】:How to use regex, switch and trim on python to retrieve a value in a file? 【发布时间】:2022-01-16 17:18:58 【问题描述】:

我有一个格式如下的文件:

Description 10.01.1
;
;     Find the information here
;
University
    National Cantoon University
Status
    National
Administrator visible
    Disable
    *Enable
Start Edu Fair Event
    Event Only
    *Event and invite user
    Event and staff
Permanently Disable
    *No
    Yes
Order
    Year 2021/Jan-Dec(14543043643)

    Year 2022/Jan-Dec(56486565465)

我想获取每个键的值。 例如,我想得到Status 的值,即National 如果值超过一个,那么我需要获取所有值,例如,我需要获取 Permanently Disable 的值,即 *No and Yes 。我在 PowerShell 中完成了这项工作,我使用了正则表达式和修剪。但现在我需要在 Python 中使用它。我是python新手,任何人都可以帮助我,我真的很感激。非常感谢

function info

    Param($Path, $Values)
    $name = $false
    switch -regex -file $Path
    
        $Values $name = $true; continue 
        '^\s'  if ($name)  $_.Trim() 
        '^\S'  if ($name)  return 
    

【问题讨论】:

【参考方案1】:
with open('text.txt', 'r') as f:
    text = f.read()

d = dict()
key = ""

# iterate line by line
for line in text.split('\n')[1:]:
    # skip empty line
    try:
        # skip header
        if line[0] == ';':
            continue
        # check whether first character is space
        # no --> key
        if not line[0].isspace():
            key = line
            d[key] = list()
            # print("key: ", line)
        # yes --> value
        else:
            # remove space
            d[key].append(line.strip())
            # print("value: ", line.strip())
    except:
        continue

输出:

>>> print(d)

 'University': ['National Cantoon University'], 
 'Status': ['National'], 
 'Administrator visible': ['Disable', '*Enable'], 
 'Start Edu Fair Event': ['Event Only', '*Event and invite user', 'Event and staff'], 
 'Permanently Disable': ['*No', 'Yes'], 
 'Order': ['Year 2021/Jan-Dec(14543043643)', 'Year 2022/Jan-Dec(56486565465)']

【讨论】:

@Cheries 我已经更新了我的答案,有用吗? @JayPeerchai,是的,它可以读取Order 部分。但另一个问题是,标题并不总是4,它总是在变化,但它总是在内容之前以; 结尾。那么,我们可以将其识别为;,而不是使用像 4 这样的静态数字吗? @Cheries 您可以使用if line[0] == ';': 检查该行是否以; 开头。我已经更新了我的答案,请看。抱歉,如果答案现在看起来太手动了。我对RE不太熟悉。 所以我尽量避免使用它。

以上是关于如何在 python 上使用正则表达式、开关和修剪来检索文件中的值?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 使用正则表达式修剪字符串空格

使用正则表达式修剪字符串空格

哪个更快?修剪()或正则表达式?

是否有正则表达式来修剪两位小数后的数字?

如何修剪字符串的开头和结尾双引号?

在 grep 和 sed 中正确使用正则表达式开关