[英]Python Regex with all optional groups
我有當前的正則表達式模式:
(.*?)?(?:<)?([\w\.-]+@[\w\.-]+)(?:>)?(.*)?
我以name <email>
格式輸入字符串,其中包含<>
,但有時會省略(我將它們設為非捕獲組的原因)。 有時我可能會在 email 之后有文本,例如name <email> fshasodi
,為此我添加了一個額外的組來捕獲它。
現在我的正則表達式的問題是,如果字符串中沒有 email,那么它與表達式不匹配。 如何使 email 也是可選的? 我知道這會使所有組都是可選的,有沒有更好的方法可以做到這一點?
您需要使用錨( ^
和$
)來確保匹配整個字符串(或行),然后您需要在匹配 email 和 rest 的模式周圍使用可選的非捕獲組。
請注意,您的非捕獲組是多余的, (?:>)?
和>?
.
此外,您不需要轉義字符 class 內的點。
因此,您可以使用
^(.*?)(?:<?([\w.-]+@[\w.-]+)>?(.*))?$
請參閱正則表達式演示。
詳情:
^
- 字符串的開頭(.*?)
- 捕獲組 1:除換行符之外的任何零個或多個字符,盡可能少(?:<?([\w.-]+@[\w.-]+)>?(.*))?
- 可選組匹配
<?
- 一個可選的<
char([\w.-]+@[\w.-]+)
- 捕獲組 2:一個或多個單詞, .
或-
字符、 @
和一個或多個單詞, .
或-
字符>?
- 一個可選的>
字符(.*)
- 捕獲組 3:除換行符之外的任何零個或多個字符,盡可能多$
- 字符串結束。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.