كيفية تقسيم الجمل في النص ؟
سؤال
أود أن تقسيم سلاسل مثل هذه
'foofo21'
'bar432'
'foobar12345'
في
['foofo', '21']
['bar', '432']
['foobar', '12345']
هل تعرف طريقة سهلة وبسيطة للقيام بذلك في الثعبان ؟
المحلول
وأود أن هذا النهج باستخدام re.match
على النحو التالي:
match = re.match(r"([a-z]+)([0-9]+)", 'foofo21', re.I)
if match:
items = match.groups()
# items is ("foo", "21")
نصائح أخرى
>>> def mysplit(s): ... head = s.rstrip('0123456789') ... tail = s[len(head):] ... return head, tail ... >>> [mysplit(s) for s in ['foofo21', 'bar432', 'foobar12345']] [('foofo', '21'), ('bar', '432'), ('foobar', '12345')] >>>
>>> r = re.compile("([a-zA-Z]+)([0-9]+)")
>>> m = r.match("foobar12345")
>>> m.group(1)
'foobar'
>>> m.group(2)
'12345'
وهكذا، إذا كان لديك قائمة من السلاسل مع هذا الشكل:
import re
r = re.compile("([a-zA-Z]+)([0-9]+)")
strings = ['foofo21', 'bar432', 'foobar12345']
print [r.match(string).groups() for string in strings]
وإخراج:
[('foofo', '21'), ('bar', '432'), ('foobar', '12345')]
ولكن خيار آخر:
>>> [re.split(r'(\d+)', s) for s in ('foofo21', 'bar432', 'foobar12345')]
[['foofo', '21', ''], ['bar', '432', ''], ['foobar', '12345', '']]
وأنا دائما واحدة لإحضار findall () =)
>>> strings = ['foofo21', 'bar432', 'foobar12345']
>>> [re.findall(r'(\w+?)(\d+)', s)[0] for s in strings]
[('foofo', '21'), ('bar', '432'), ('foobar', '12345')]
ملحوظة أنني أستخدم أبسط (أقل لكتابة) باستخدام التعابير المنطقية من معظم الأجوبة السابقة.
import re
s = raw_input()
m = re.match(r"([a-zA-Z]+)([0-9]+)",s)
print m.group(0)
print m.group(1)
print m.group(2)
دون استخدام التعابير المنطقية باستخدام isdigit() المدمج في وظيفة يعمل فقط إذا كان ابتداء من جزء النص الأخير هو عدد
def text_num_split(item):
for index, letter in enumerate(item, 0):
if letter.isdigit():
return [item[:index],item[index:]]
print(text_num_split("foobar12345"))
الإخراج :
['foobar', '12345']
لا تنتمي إلى StackOverflow