簡體   English   中英

正則表達式,使用單詞邊界捕獲而不在“點”和/或其他字符處停止

[英]Regex, capture using word boundaries without stopping at "dot" and/or other characters

例如給定一個這樣的字符串:
隨機詞,隨機字符##?,一些點。 用戶名 bob.1234 其他東西

我目前正在使用此正則表達式來捕獲用戶名 (bob.1234):

\busername (.+?)(,| |$)

但是我的代碼需要一個只有一個捕獲組的正則表達式,因為當有多個捕獲組時,python 的re.findall返回不同的東西。 像這樣的東西幾乎可以工作,除了它會捕獲用戶名“bob”而不是“bob.1234”:

\busername (.+?)\b

任何人都知道是否有一種方法可以在忽略並且不使用多個捕獲組的情況下使用單詞邊界?

筆記:

  • 有時在用戶名后有一個逗號
  • 有時用戶名后面有一個空格
  • 有時字符串以用戶名結尾

\\busername (.+?)(,| |$)模式包含 2 個捕獲組,一旦找到匹配項, re.findall將返回一個元組列表。 請參閱findall參考

如果模式中存在一個或多個組,則返回組列表; 如果模式有多個組,這將是一個元組列表。 空匹配項包含在結果中,除非它們觸及另一個匹配項的開頭。

所以,這里有三種方法:

  1. 使用(?:...)非捕獲組而不是捕獲組: re.findall(r'\\busername (.+?)(?:,| |$)', s) 它將消耗,或空間,但由於只會返回捕獲的部分並且預計不會出現重疊匹配,因此可以。
  2. 改用正向前瞻: re.findall(r'\\busername (.+?)(?=,| |$)', s) 不會消耗空格和逗號,這是與第一種方法的唯一區別。
  3. 您可以將(.+?)(,| |$)轉換為一個簡單的否定字符類[^ ,]+ ,它匹配一個或多個除空格或逗號以外的字符。 如果username后沒有,或空格,它將匹配到字符串末尾。

暫無
暫無

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

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