簡體   English   中英

在 python 3 中使用正則表達式查找 substring 的最佳方法

[英]best way to find substring using regex in python 3

我試圖找出在鍵值對中使用re找到特定 substring 的最佳方法:

some_string-variable_length/some_no_variable_digit/some_no1_variable_digit/some_string1/some_string2
eg: aba/101/11111/cde/xyz or aaa/111/1119/cde/xzx or ada/21111/5/cxe/yyz

這里一切都是可變的,我正在尋找的是鍵值對中的如下內容:

`cde: 2` as there are two entries for cde

cxe: 1 as there is only one cxe

注意:這里的一切都是可變的,除了/ 即 cde 或 cxe 或某些字符串將恰好在兩個/之后出現

input:aba/101/11111/cde/xyz/blabla
output: cde:xyz/blabla
input: aaa/111/1119/cde/xzx/blabla
output: cde:xzx/blabla
input: aahjdsga/11231/1119/gfts/sjhgdshg/blabla
output: gfts:sjhgdshg/blabla

如果您注意到這里,我的鍵始終是第 3 個/之后的第一個字符串,值始終是鍵后的 substring

以下是基於您的描述的幾個解決方案,即“鍵始終是第 3 個 / 之后的第一個字符串,值始終是鍵后的 substring”。 第一個使用str.splitmaxsplit為 4,將第四個/之后的所有內容收集到值中。 第二個使用正則表達式提取兩個部分:

inp = ['aba/101/11111/cde/xyz/blabla',
        'aaa/111/1119/cde/xzx/blabla',
        'aahjdsga/11231/1119/gfts/sjhgdshg/blabla'
        ]

for s in inp:
    parts = s.split('/', 4)
    key = parts[3]
    value = parts[4]
    print(f'{key}:{value}')

import re

for s in inp:
    m = re.match(r'^(?:[^/]*/){3}([^/]*)/(.*)$', s)
    if m is not None:
        key = m.group(1)
        value = m.group(2)
        print(f'{key}:{value}')

對於這兩段代碼,output 是

cde:xyz/blabla
cde:xzx/blabla
gfts:sjhgdshg/blabla

試試(?<?\S)[^\s/]*(::/[^\s/]*){2}/([^\s/]*)

演示


按評論嘗試新的

(?<?\S)[^\s/]*(:?/[^\s/]*){2}/([^\s/]*)(:?/(\S*))?

演示2

其他人已經發布了各種正則表達式; 一個更廣泛的問題——這個問題最好用正則表達式解決嗎? 根據數據的整體格式化方式,使用它可能會更好地解析

  • 字符串上.split('/')方法; 或者
  • csv.reader(..., delimiter='/')csv.DictReader(..., delimiter='/')csv模塊中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM