رمز Python لاستخدام تعبير منتظم للتأكد من أن السلسلة هي الأبجدية الرقمية. - _
-
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()
يتم تخزينها مؤقتًا ، لذا لا داعي للقلق برامج لا تستخدم سوى عدد قليل من التعبيرات العادية في وقت ما.