بيثون RegEx تخطي الأحرف الأولى ؟
-
06-07-2019 - |
سؤال
مرحبا لدي إلى حد ما السؤال الأساسي حول التعبيرات العادية.أريد فقط العودة النص في الداخل (ومنها) الجسم به ، و أعلم التالية ليست صحيحة لأنه سوف تتناسب مع جميع الشخصيات قبل افتتاح العلامة الجسم.كنت أتساءل كيف يمكنك أن تذهب نحو تخطي هذه ؟
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>]
نصائح أخرى
وأنا لا أعرف بيثون، ولكن هنا مثال سريع القيت معا باستخدام حساء جميل أ >، والتي كثيرا ما أرى الموصى بها للتحليل بيثون HTML.
import BeautifulSoup
soup = BeautifulSoup(fileString)
bodyTag = soup.html.body.string
وهذه الإرادة (نظريا) صفقة مع كل تعقيدات HTML، وهو أمر صعب للغاية مع إجابات القائم على التعابير المنطقية الخالصة، لأنها ليست ما رجإكس صمم ل.
وأنت لا يمكن تحليل HTML مع التعابير المنطقية. HTML ليست لغة العادية. استخدام محلل HTML مثل lxml بدلا من ذلك.
x = re.match('.*(<body>.*?</body>)', fileString)
والنظر minidom للتحليل HTML.
x = re.search('(<body>.*</body>)', fileString)
x.group(1)
والكتابة أقل من الإجابات مباراة
لا تحتوي على fileString خطوط متعددة?في هذه الحالة قد تحتاج إلى تحديد أو تخطي خطوط صراحة:
x = re.match(r"(?:.|\n)*(<body>(?:.|\n)*</body>)", fileString)
أو ببساطة أكثر مع إعادة الوحدة:
x = re.match(r".*(<body>.*</body>)", fileString, re.DOTALL)
x.groups()[0]
يجب أن تحتوي على سلسلة الخاص بك إذا كان x هو لا شيء.