簡體   English   中英

正則表達式-使用*和一組字符

[英]Regex - Using * with a set of characters

我是regex的新手,但遇到了一個無法解決的問題:

我正在嘗試匹配以任意數量的AZ,0-9和_字符開頭的一組字符,可以選擇在其后跟一個用括號括起來的數字,並可以將它們與原始字符串分隔開空間(或不)

應找到的示例:

_ABCD1E
_123FD(13)
ABDF1G (2)

這是我當前的正則表達式:

[A-Z_0-9]+\s*\({0,1}[\d]*\){0,1}

它發現一切都很好,但是如果我有以下內容,則存在問題:

_ABCDE )

它只應抓取_ABCDE而不是“)”,但當前應抓取'_ABCDE)'

如果不存在整個模式,有什么辦法可以抓住(#)但不能獲得多余的字符?

如果可能,請解釋我打算學習的語法,而不僅僅是獲得答案。

解答:到目前為止,以下代碼可滿足我的需求:

[A-Z_0-9]+(\s*\([\d]+\)){0,1}
# or, as has been mentioned, the above can be simplified
# and cleaned up a bit to be
[A-Z_0-9]+(\s*\(\d+\))?
# The [] around \d are unnecessary and {0,1} is equivalent to ?

在(#)模式兩邊加上括號可以使用? 或整個樣式上的{0,1}。 我也將[\\ d] *更改為[\\ d] +,以確保括號內至少有一個數字。

謝謝大家的快速答復!

您的正則表達式說,每個括號(打開和關閉)可能獨立存在,也可能不存在。 相反,您應該說用括號括起來的數字可能存在或不存在:

(\([\d]*\)){0,1}

注意,這允許在括號內什么也沒有。 這就是您的正則表達式所說的,但是我不清楚這就是您真正想要的。

怎么樣

^[A-Z0-9_]+\s*(\([0-9]+\))?$

順便說一句,在您的示例中,第一部分不僅接受[A-Z_] ,而且接受[0-9]

這似乎可以完成工作。

[1-9A-Z_]+\s*(?:\([1-9]*\))?

似乎您想要以下正則表達式:

^[A-Z\d_]+(\s*\(\d+\))?$

我使用了一個非捕獲組,以避免對結果進行分組匹配:

>>> pattern = r'[A-Z_]+\s*(?:\(\d+\)|\d*)'
>>> l = ['_ABCD1E', '_123FD(13)', 'ABDF1G (2)', '_ABCDE )', 'A_B (15)', 'E (345']
>>> [re.search(pattern , i).group() for i in l]
['_ABCD1', '_123', 'ABDF1', '_ABCDE ', 'A_B (15)', 'E ']

暫無
暫無

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

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