假设我有这些字符串:
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
答案 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']
编辑:我对模式进行了一些更改,因为它没有捕获列表中的第三项以生成预期的输出。