over 3 years ago

今天在研究如何用 Regular Expression 來分析 LDAP 帳號時,突然有間有種以前看不懂得 Term 突然都了解的感覺。立馬做個記錄。

Syntax

() Capturing group - 括弧內的符合的內容會被收集起來

(?:) Non-capturing group - 告訴 Parser 不要收集此括弧內的內容

[] Character class - 一般大家熟悉的允許字元的集合

[^] Negated Character class - 跟 Character class 相反,是不允許字元的集合,^ 一定要在開頭

?= Positive lookahead - 緊鄰的字元必須符合

?! Negative lookahead - 緊鄰的字元不得符合

Example
  1. _(?=a): 底線後方必須馬上接英文字母 a

    • _abc -> match
    • _cde -> not match
  2. _(?!a): 底線後方不得為英文字母 a

    • _abc -> not match
    • _cde -> match

練習

這些例子可以在 Rubular 上作實驗。

  1. Find all values of ou and dc in the following LDAP string:

    uid=jim,ou=student,ou=mathematics,dc=nccu
    

    Pattern

    (?:ou|dc)=([^,]+)+
    
  2. Find all attribute in a HTML tag.

Python re

Python 使用 re 時,常用的指令有 2 個,分別是 re.search 以及 re.findall。差別主要在於 search 只要找到第一個就會停止了,findall 則會把整個字串分析完。

例子
import re

ldap_pattern = re.compile(r"(?:ou|dc)=([^,]+)+")
my_string = "uid=jim,ou=student,ou=mathematics,dc=nccu"

re.search(ldap_pattern, my_string).group()
re.findall(ldap_pattern, my_string)

Reference

  1. What I Learned Today: Regular Expression Backreferences
  2. Non capturing group? (?:)
  3. Lookaround
← Lambda Calculus Study Note Raspberry Pi 網路設定小撇步 →
 
comments powered by Disqus