簡體   English   中英

正則表達式替換除模式之外的所有內容

[英]Regex Replace All But Pattern

這可能是重復的,但我試圖替換除某個字符串模式之外的所有內容。 以下是字符串示例:

'dkas;6-17'
'dsajdl 10'
'dsjalkdj16-20'

這里的目標是用任何東西替換任何不是數字的東西。 所以我從上面的字符串中得到的是:

'6-17'
''
'16-20'

第二個字符串不會產生任何結果,因為它與模式不匹配。 我知道匹配我的模式的正則表達式,但我對如何使用 regexp_replace 匹配除該模式之外的所有內容感到困惑。 以下是我所擁有的,但這取代了我想要實際保留的模式。

re.sub('[0-9]{1,2}\-[0-9]{1,2}', '', text)

如果您的意思是第二個不會產生任何結果,您可以匹配除數字或換行符之外的任何字符,然后捕獲組中的模式。

如果 sub 應該留下一個空字符串,您可以使用交替匹配整行。

[^\d\r\n]+(\d{1,2}-\d{1,2})|.+

在零件

  • [^\d\r\n]+匹配除數字或換行符以外的任何字符 1+ 次
  • (\d{1,2}-\d{1,2})捕獲組 1 ,匹配 1-2 位, -和 1-2 位
  • | 或者
  • .+匹配除換行符以外的任何字符 1 次以上

正則表達式演示| Python 演示

示例代碼

import re

lines = [
    'dkas;6-17',
    'dsajdl 10',
    'dsjalkdj16-20'
]

for text in lines:
    print(re.sub('[^\d\r\n]+(\d{1,2}-\d{1,2})|.+', r'\1', text))

Output

6-17

16-20

只查找字符串中的所有匹配項並將它們連接在一起怎么樣?

>>> ''.join(re.findall('[0-9]{1,2}\-[0-9]{1,2}', 'dkas;6-17abc19-10'))
'6-1719-10'

>>> ''.join(re.findall('[0-9]{1,2}\-[0-9]{1,2}', 'dsajdl 10'))
''

考慮匹配

\d+-\d+|$

演示

如果字符串是

dkas;6-17

第一個匹配是6-17 ,第二個是行尾的空字符串。

如果字符串是

dsjalkdj16-20kl21-33mn

將有三場比賽, 16-2021-33和行尾的空白區域。

如果字符串是

dsajdl 10

第一個(也是唯一的)匹配將是行尾的空字符串。

因此,如果有一個匹配項,它將是字符串末尾的空字符串,該字符串將被返回; 否則,根據要求返回第一個或除最后一個之外的所有匹配項。

暫無
暫無

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

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