رمز Python لاستخدام تعبير منتظم للتأكد من أن السلسلة هي الأبجدية الرقمية. - _

StackOverflow https://stackoverflow.com/questions/2519670

  •  22-09-2019
  •  | 
  •  

سؤال

نظرت وبحثت ولم أتمكن من العثور على ما أحتاجه على الرغم من أنني أعتقد أنه يجب أن يكون بسيطًا (إذا كان لديك أي تجربة Python ، وهو ما لا).

بالنظر إلى سلسلة ، أريد التحقق ، في بيثون ، أنه يحتوي فقط على أحرف أبجدية رقمية: a-zA-Z0-9 و . _ -

أمثلة:

وافقت:

bill-gates

Steve_Jobs

Micro.soft

مرفوض:

Bill gates - لا يسمح بالمساحات

me@host.com - @ ليس أبجديًا رقميًا

أحاول استخدام:

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

لكن هذا لا يبدو أنه يقوم بالمهمة ...

هل كانت مفيدة؟

المحلول

re.match لا يعيد منطقية. يعود أ MatchObject في المباراة ، أو None على غير مطابقة.

>>> 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

لذلك ، يجب ألا تفعل re.match(...) == True; ؛ بدلا من ذلك ، يجب أن تتحقق re.match(...) is not None في هذه الحالة ، والتي يمكن تقصيرها إلى فقط if re.match(...).

نصائح أخرى

لم أستعمل أبدا == True أو == False في المقارنة. العديد من الأنواع لديها بالفعل مكافئ منطقي يجب عليك استخدامه بدلاً من ذلك:

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

يمكن أن تقصر الأمر قليلاً على:

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

أود أن أعتبر هذا لاسم مستخدم صالح:
1) يجب أن يكون اسم المستخدم 6-30 حرفًا
2) قد يحتوي اسم المستخدم فقط على:

  • الأحرف الكبيرة والصغيرة
  • أرقام من 0-9 و
  • أحرف خاصة _ -.

3) اسم المستخدم قد لا:

  • ابدأ أو الانتهاء من الأحرف _ -.

  • لديك أكثر من حرف متسلسل _ -. داخل

سيكون هذا مثالًا على الاستخدام:
if re.match(r'^(?![-._])(?!.*[_.-]{2})[\w.-]{6,30}(?<![-._])$',username) is not None:

أقوم بالتحقق الخاص بي بهذه الطريقة في صف utils الخاص بي:

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

ثم أسمي مثيل Utils ، وتحقق من هذا الطريق:

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

إذا كنت ستستخدم العديد من التعبيرات العادية ، فيمكنك تجميعها للسرعة (أو قابلية القراءة)

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

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

من المستندات:

انتقلت الإصدارات المترجمة من أحدث الأنماط re.match(), re.search() أو re.compile() يتم تخزينها مؤقتًا ، لذا لا داعي للقلق برامج لا تستخدم سوى عدد قليل من التعبيرات العادية في وقت ما.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top