2010-03-25 30 views
5

Tôi nhìn và tìm kiếm và không thể tìm thấy những gì tôi cần mặc dù tôi nghĩ rằng nó phải đơn giản (nếu bạn có bất kỳ kinh nghiệm Python, mà tôi không).Mã Python để sử dụng cụm từ thông dụng để đảm bảo chuỗi là chữ số và chữ số. - _

Cho một xâu, tôi muốn xác minh, bằng Python, nó chứa các ký tự CHỈ chữ và số: a-zA-Z0-9._-

ví dụ:

chấp nhận:

bill-gates

Steve_Jobs

Micro.soft

Bị từ chối:

Bill gates - không có khoảng trống cho phép

[email protected] - @ không phải là chữ và số

Tôi đang cố gắng để sử dụng:

if re.match("^[a-zA-Z0-9_.-]+$", username) == True:

Nhưng điều đó dường như không làm công việc ...

+3

re.match() không trả về một boolean, nó trả về một [MatchObject] (http://docs.python.org/ library/re.html # re.match), "luôn có giá trị boolean True" hoặc None. –

+0

Nó luôn luôn là xấu để sử dụng '== True'. Đó là lúc tốt nhất dư thừa và trong một trường hợp như thế này, chỉ cần không làm việc. –

+2

Bạn có thực sự cân nhắc (ví dụ) '---.___' là một trận đấu hợp lệ không? –

Trả lời

15

re.match không trả về giá trị boolean; nó trả về một số MatchObject trên một trận đấu hoặc None trên một trận đấu không khớp.

>>> re.match("^[a-zA-Z0-9_.-]+$", "hello") 
<_sre.SRE_Match object at 0xb7600250> 
>>> re.match("^[a-zA-Z0-9_.-]+$", " ") 
>>> print re.match("^[a-zA-Z0-9_.-]+$", " ") 
None 

Vì vậy, bạn không nên làm re.match(...) == True; thay vào đó, bạn nên kiểm tra re.match(...) is not None trong trường hợp này, có thể được rút ngắn lại thành chỉ if re.match(...).

3

Không bao giờ sử dụng == True hoặc == False để so sánh. Nhiều loại đã có một tương đương bool mà bạn nên sử dụng thay vì:

if re.match("^[a-zA-Z0-9_.-]+$", username): 
2

cũng có thể rút ngắn nó nhẹ:

if re.match(r'^[\w.-]+$', username): 
0

Nếu bạn đang sử dụng nhiều biểu thức thông thường bạn có thể biên dịch nó cho tốc độ (hoặc dễ đọc)

import re 
ALPHANUM=re.compile('^[a-zA-Z0-9_.-]+$') 

for u in users: 
    if ALPHANUM.match(u) is None: 
     print "invalid" 

Từ the docs:

Các phiên bản được biên dịch của các mẫu gần đây nhất được chuyển đến re.match(), re.search() hoặc re.compile() được lưu vào bộ nhớ cache, do đó, các chương trình chỉ sử dụng một vài cụm từ thông dụng tại một thời điểm không cần phải lo lắng về việc biên soạn các cụm từ thông dụng.

0

tôi làm xác nhận của tôi theo cách này trong lớp utils tôi:

def valid_re(self, s, r): 
reg = re.compile(r) 
return reg.match(s) 

Sau đó tôi gọi là dụ utils, và kiểm tra theo cách này:

if not utils.valid_re(username, r'^[a-zA-Z0-9_.-]+$'): 
     error = "Invalid username!" 
0

tôi sẽ xem xét việc này cho tên người dùng hợp lệ:
1) Tên người dùng phải có 6-30 charackters dài
2) Tên người dùng chỉ có thể chứa:

  • Chữ hoa và chữ thường
  • số 0-9 và
  • Ký tự đặc biệt _ -.

3) Tên đăng nhập không được:

  • Bắt đầu hoặc kết thúc với các nhân vật _ -.

  • Có nhiều ký tự sequence _ -. bên

Đây sẽ là ví dụ về việc sử dụng:
if re.match(r'^(?![-._])(?!.*[_.-]{2})[\w.-]{6,30}(?<![-._])$',username) is not None:

Các vấn đề liên quan