一个Regex如何只匹配Python中字符串的前几个字符?

时间:2020-07-05 20:01:03

标签: python regex

假设我有这些字符串:

P 1 (BNN-03) Voertuig te water Curacaostraat Groningen 011810 011871 013593 011833

A1 AMBU 18177 Binnendams 3373AE Hardinxveld-Giessendam HARDGD bon 81505

Prio 4(DIA: ja) AMBU 17104 F. Bordewijkstraat 3069WB Rotterdam ROTTDM bon 29230

我编写了以下正则表达式对其进行测试:

^[ABP]\s?\d{1,3}|^PRIO\s?[1-5]|^\d{1,3}e?

我如何只能测试该字符串的前8个字符?我尝试了以下方法:

import re

str_to_test = "P 1 (BNN-03) Voertuig te water Curacaostraat Groningen 011810 011871 013593 011833"
expr = re.compile(r"^[ABP]\s?\d{1,3}|^PRIO\s?[1-5]|^\d{1,3}e?", re.IGNORECASE)
result = re.sub(expr, '', str_to_test);
print(result) #  (BNN-03) Voertuig te water Curacaostraat Groningen 011810 011871 013593 011833

但这会完成整个字符串,这不是我想要的。我尝试将str_to_test更改为str_to_test[:8]以获取前8个字符,但这删除了我也需要的其余字符。请在这里帮助我。

我希望看到的输出:

P 1 (BNN-03) Voertuig te water Curacaostraat Groningen 011810 011871 013593 011833-> (BNN-03) Voertuig te water Curacaostraat Groningen 011810 011871 013593 011833

A1 AMBU 18177 Binnendams 3373AE Hardinxveld-Giessendam HARDGD bon 81505-> AMBU 18177 Binnendams 3373AE Hardinxveld-Giessendam HARDGD bon 81505

Prio 4 (DIA: ja) AMBU 17104 F. Bordewijkstraat 3069WB Rotterdam ROTTDM bon 29230-> (DIA: ja) AMBU 17104 F. Bordewijkstraat 3069WB Rotterdam ROTTDM bon 29230

3 个答案:

答案 0 :(得分:0)

您可以使用切片,更改:

(define (tag-header title level)
  (if (> level 6)
      (set! level 6)
      void)
  (let [(lvl (number->string level))]
    (string-append "<h" lvl ">" title "</h" lvl ">")))

收件人:

result = re.sub(expr, '', str_to_test);


要更好地了解切片的工作原理,

result = re.sub(expr, '', str_to_test[:8])+str_to_test[8:];

输出:

a = '1234567890'

print(a[:8], a[8:])

答案 1 :(得分:0)

之后无需提取切片并重建字符串;您可以在单个正则表达式匹配项中提取所需的任何内容。您可以将所需字符串的一部分包含在捕获组中:

(?:^[ABP]\s?\d{1,3}|^PRIO\s?[1-5]|^\d{1,3}e?)\s*(?P<main>.*)

第一个组(?:^[ABP]\s?\d{1,3}|^PRIO\s?[1-5]|^\d{1,3}e?)是不捕获的部分,它没有捕获,而您感兴趣的字符串的部分(即后面的任何内容)则被括起来在命名组(?P<main>.*)中。

因此,要提取它,请将上面的模式与整个字符串匹配,然后提取名为main的组:

import re

str_to_test = "P 1 (BNN-03) Voertuig te water Curacaostraat Groningen 011810 011871 013593 011833"
pattern = re.compile(r"(?:^[ABP]\s?\d{1,3}|^PRIO\s?[1-5]|^\d{1,3}e?)\s*(?P<main>.*)", re.IGNORECASE)
match = pattern.match(str_to_test)
result = match.group("main")
print(result)

输出:

(BNN-03) Voertuig te water Curacaostraat Groningen 011810 011871 013593 011833

答案 2 :(得分:0)

如果您需要快速更换,可以使用re.sub()。一旦定义了模式,并创建了一个包含所有希望处理的字符串的列表,就可以使用列表理解来解决该问题:

import re
strings = ['P 1 (BNN-03) Voertuig te water Curacaostraat Groningen 011810 011871 013593 011833',
           'A1 AMBU 18177 Binnendams 3373AE Hardinxveld-Giessendam HARDGD bon 81505',
           'Prio 4(DIA: ja) AMBU 17104 F. Bordewijkstraat 3069WB Rotterdam ROTTDM bon 29230']
pattern = re.compile(r'^[ABP]\s?\d{1,3}|^Prio\s?[1-5]|^\d{1,3}e?')
strings_clean = [re.sub(pattern,'',x).strip() for x in strings]

这将输出:

['(BNN-03) Voertuig te water Curacaostraat Groningen 011810 011871 013593 011833',
 'AMBU 18177 Binnendams 3373AE Hardinxveld-Giessendam HARDGD bon 81505',
 '(DIA: ja) AMBU 17104 F. Bordewijkstraat 3069WB Rotterdam ROTTDM bon 29230']

编辑:我对模式进行了一些更改,因为它没有捕获列表中的第三项以生成预期的输出。

相关问题