سؤال

مرحبا لدي إلى حد ما السؤال الأساسي حول التعبيرات العادية.أريد فقط العودة النص في الداخل (ومنها) الجسم به ، و أعلم التالية ليست صحيحة لأنه سوف تتناسب مع جميع الشخصيات قبل افتتاح العلامة الجسم.كنت أتساءل كيف يمكنك أن تذهب نحو تخطي هذه ؟

x = re.match('(.*<body).*?(</body>)', fileString)

وذلك بفضل!

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

المحلول

وهنا بعض رمز المثال الذي يستخدم التعابير المنطقية للعثور على جميع النص بين العلامات <body>...</body>. ورغم أن هذا يدل على بعض ملامح حدة اعادة الثعبان، ونلاحظ أن جميلة حساء حدة من السهل جدا استخدام وهو أداة أفضل لاستخدام إذا كنت تخطط لتحليل HTML أو XML. (انظر أدناه للحصول على مثال كيف يمكن تحليل هذه BeautifulSoup استخدام).

#!/usr/bin/env python
import re

# Here we have a string with a multiline <body>...</body>
fileString='''baz<body>foo
baby foo
baby foo
baby foo
</body><body>bar</body>'''

# re.DOTALL tells re that '.' should match any character, including newlines.
x = re.search('(<body>.*?</body>)', fileString, re.DOTALL)
for match in x.groups():
    print(match)
# <body>foo
# baby foo
# baby foo
# baby foo
# </body>

إذا كنت ترغب في جمع جميع المباريات، هل يمكن استخدام re.findall:

print(re.findall('(<body>.*?</body>)', fileString, re.DOTALL))
# ['<body>foo\nbaby foo\nbaby foo\nbaby foo\n</body>', '<body>bar</body>']

وإذا كنت تخطط لاستخدام هذا النمط أكثر من مرة واحدة، يمكنك قبل ترجمة عليه:

pat=re.compile('(<body>.*?</body>)', re.DOTALL)
print(pat.findall(fileString))
# ['<body>foo\nbaby foo\nbaby foo\nbaby foo\n</body>', '<body>bar</body>']

وهنا هو كيف يمكنك أن تفعل ذلك مع BeautifulSoup:

#!/usr/bin/env python
from BeautifulSoup import BeautifulSoup

fileString='''baz<body>foo
baby foo
baby foo
baby foo
</body><body>bar</body>'''
soup = BeautifulSoup(fileString)
print(soup.body)
# <body>foo
# baby foo
# baby foo
# baby foo
# </body>

print(soup.findAll('body'))
# [<body>foo
# baby foo
# baby foo
# baby foo
# </body>, <body>bar</body>]
scroll top