【问题标题】:How extract the specific word from a file that has some characters present in it?如何从包含某些字符的文件中提取特定单词?
【发布时间】:2018-07-16 09:33:15
【问题描述】:

我有一个文件log.txt,其中包含:

Router:94.126.126.109
Name:nl-rtm02a-ra2
show running-config interface^M
^MWed Jul 11 12:42:03.409 CET^M
! ****  Configuration start **** RING  rt72-central  RA2 ****^M
! # RING INTERFACE CONFIGURATION^M

 service-policy output NA4-PM-FRFB+COS^M
 ipv4 address 84.116.244.181 255.255.255.252^M
 bundle minimum-active links 1^M
 load-interval 30^M
 flow ipv4 monitor NA4-MONITOR-MAP sampler NA4-SAMPLER-MAP ingress^M
 flow ipv6 monitor NA4-IPV6-MONITOR-MAP sampler NA4-SAMPLER-MAP ingress^M
!^M
interface Bundle-Ether1001^M
 description ** ICL to RA2-SAT1 **^M
 vrf NV_Mgmt^M
 ipv4 point-to-point^M
 ipv4 unnumbered Loopback1000^M
 load-interval 30^M
 flow ipv4 monitor NA4-MONITOR-MAP sampler NA4-SAMPLER-MAP ingress^M
 flow ipv6 monitor NA4-IPV6-MONITOR-MAP sampler NA4-SAMPLER-MAP ingress^M
 nv^M
  satellite-fabric-link satellite 1001^M
   remote-ports GigabitEthernet 0/0/0-43^M
  !^M
 !^M
!^M
interface Bundle-Ether2000^M
 description ** LACP Uplink to rt53cbr68 **^M
 mtu 9192^M
 bundle minimum-active links 1^M
 load-interval 30^M
!^M
interface Bundle-Ether2000.251^M
 description ** rt53abr68 IPv4 B-Side **^M
 vrf 03109128:NL_CMTS_ACCESS^M
 ipv4 mtu 1500^M
 ipv4 address 212.142.4.45 255.255.255.252^M
 flow ipv4 monitor NA4-MONITOR-MAP sampler NA4-SAMPLER-MAP ingress^M
 flow ipv6 monitor NA4-IPV6-MONITOR-MAP sampler NA4-SAMPLER-MAP ingress^M
 encapsulation dot1q 251^M
!^M
interface Bundle-Ether2000.651^M
 description ** rt53dbr68 IPv6 B-Side **^M
 ipv6 nd prefix default no-autoconfig^M
 ipv6 address 2a02:a200:40:56::1/64^M
 encapsulation dot1q 651^M
!^M
interface Bundle-Ether2000.701 l2transport^M
 description ** BSOD SDN-NFV Traffic rt53cbr68 **^M
 encapsulation dot1q 2501-2699^M

在此文件中,我需要提取包含"cbr""abr""dbr" 的单词并将其存储在 CSV 文件中。

例如,在上面的内容中,我要提取:

1.rt53cbr68 
2.rt53abr68 
3.rt53dbr68

我尝试了以下代码:

with open("file.txt", "r") as f:
searchlines = f.readlines()


for i, line in enumerate(searchlines):
    if "cbr" in line:
        for l in searchlines[i:i+3]:
           print l

还有一件事我想从文件内容中获取路由器值并将其存储在变量中..

【问题讨论】:

  • 那么您发布的代码有什么问题?您目前只检查三件事中的一件,所以不妨看看or
  • fabric 还包含abr。您是否希望匹配 crbabrdbr 前面和后面都有数字的单词?
  • @jonrsharpe - 我想提取特定的单词而不是整个字符串..
  • 所以请查看str.splitre。给出一个minimal reproducible example,它实际上说明了具体的问题。
  • @pkpkpk - 哦,对不起,我没注意到。我只想要描述行中的那个词。

标签: python regex search extract


【解决方案1】:

这将匹配任何包含 abrcbrdbr 的描述行

>>> import re
>>> list(enumerate(re.findall(r'description.*\s(.*?[cad]br.*?)\s', data)))
[(0, 'rt53cbr68'), (1, 'rt53abr68'), (2, 'rt53dbr68'), (3, 'rt53cbr68')]
>>> 

【讨论】:

  • -还有一件事我想从文件内容中获取路由器值并将其存储在变量中。我该怎么做..?
  • 使用re.search。类似rtr = re.search(r'Router:\s*(.*?)\s', data).group(1)
【解决方案2】:

在您的示例中,该行并不重要,这就是为什么我建议使用 read() 而不是 readlines(),并使用 split() 返回每个单词的列表(使用 split() 会拆分您的用“”和“\n”分隔的文本)。

with open("file.txt", "r") as f:
    words = f.read().split()
    routerNames = []
    z = 1
    for wrd in words:
        if ("cbr" in wrd) or ("abr" in wrd) or ("dbr" in wrd):
            routerNames.append(str(z)+ ". " + wrd)
            z+=1

    with open("file2.txt","w") as g:
        g.write("\n".join(routerNames))

注意:此代码将获取包含这些字符的所有单词,甚至是您不想要的单词。我建议添加另一个条件以尽量减少错误。

with open("file.txt", "r") as f:
    words = f.read().split()


    for wrd in words:
        if (("cbr" in wrd) or ("abr" in wrd) or ("dbr" in wrd)) and ("rt" in wrd):
            ...

【讨论】:

  • 还有一件事我想从文件内容中获取路由器值并将其存储在变量中。我该怎么做..?
【解决方案3】:

要匹配您的值,您可以使用带有finditer 的正则表达式。

您可以匹配一个或多个单词字符 \w+ 和一个或多个数字 \d+,然后使用字符类 [cad] 匹配任何这些字符,后跟 br 和一个或多个数字。

对于路由器值,您可以使用命名组(?P<router>\d+(?:\.\d+)+) 和正向后视(?<= 来断言左侧是Router,前面是单词边界\b

匹配其中任何一个和alternation |

(?<=\bRouter:)(?P<router>\d+(?:\.\d+)+)|\w+\d+[cad]br\d+\b

Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多