Когда я был в другом офисе, и в этом проекте у меня была похожая проблема, все функции выравнивания в библиотеке не работали. Но у меня есть хитрое решение сделать так, чтобы изображение логотипа стало центром. Я рисую растровое изображение с белым или прозрачным разрешением и помещаю положение ширины прямо в середине квитанции.
public Bitmap createBitmap(Rect rectImage, int i, int j) {
Paint p = new Paint();
p.setStyle(Style.FILL_AND_STROKE);
p.setAntiAlias(true);
p.setFilterBitmap(true);
p.setDither(true);
p.setColor(Color.WHITE);
Bitmap bitmap = Bitmap.createBitmap(rectImage.width() * 2,
rectImage.height() * 2, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bitmap);
// c.drawColor(Color.RED);
c.drawRect(rectImage.left, rectImage.top, rectImage.right,
rectImage.bottom, p);
return bitmap;
}
Затем объединяю это растровое изображение с вашим логотипом. , пожалуйста, используйте код, подобный этому (не этот код)
public static Bitmap mergeToPin(Bitmap left, Bitmap right) {
Bitmap result = Bitmap.createBitmap(left.getWidth(), left.getHeight(), left.getConfig());
Canvas canvas = new Canvas(result);
int widthleft = left.getWidth();
int widthright = right.getWidth();
canvas.drawBitmap(left, 0f, 0f, null);
canvas.drawBitmap(right, widthleft, 0f, null);
return result;
}
Как вы знаете, размер квитанции можно предсказать. Таким образом, вы можете сделать статическое значение для ширины прозрачного изображения
>>> from BeautifulSoup import BeautifulSoup, Comment
>>> html = '<html><!--[if IE]> bloo blee<![endif]--></html>'
>>> soup = BeautifulSoup(html)
>>> comments = soup.findAll(text=lambda text:isinstance(text, Comment)
and text.find('if') != -1) #This is one line, of course
>>> [comment.extract() for comment in comments]
[u'[if IE]> bloo blee<![endif]']
>>> print soup.prettify()
<html>
</html>
>>>
python 3 с bf4:
from bs4 import BeautifulSoup, Comment
html = '<html><!--[if IE]> bloo blee<![endif]--></html>'
soup = BeautifulSoup(html, "html.parser")
comments = soup.findAll(text=lambda text:isinstance(text, Comment)
and text.find('if') != -1) #This is one line, of course
[comment.extract() for comment in comments]
[u'[if IE]> bloo blee<![endif]']
print (soup.prettify())
Если Ваши данные перепутали BeautifulSoup, можно зафиксировать его перед рукой или настроить синтаксический анализатор среди других решений.
Править: На Ваш комментарий Вы просто изменяете лямбду, переданную findAll, поскольку Вам нужно (я изменил его),
Поскольку я вижу его, только необходимо волноваться о скрытых от низкого уровня комментариях (те, которые запускаются с <!--
), и Вы ничему не должны соответствовать вне слова if
и пространство после него. Это должно сделать то, что Вы хотите:
"<!--\[if\s(?:[^<]+|<(?!!\[endif\]-->))*<!\[endif\]-->"
Та путаница в середине состоит в том, чтобы удовлетворить Ваше требование не использовать .*?
, но я действительно не думаю, что это стоит усилия. .*?
подход должен хорошо работать при компиляции regex с Ре. Набор флага S или переносит его в (?s:...)
. Например:
"(?s:<!--\[if\s.*?<!\[endif\]-->)"
Вот то, в чем Вы будете нуждаться:
<!(|--)\[[^\]]+\]>.+?<!\[endif\](|--)>
Это отфильтрует все виды условных комментариев включая:
<!--[if anything]>
...
<[endif]-->
и
<![if ! IE 6]>
...
<![endif]>
EDIT3: работы решения Vinko Vrsalovic, но фактическая проблема, почему отказавший beautifulsoup был из-за комментария жулика в рамках условного комментария. Как
Заметить комментарий?
Хотя моя проблема была, решают, я хотел бы получить regex решение для этого.
Как насчет этого:
(<!(|--)\[[^\]]+\]>.*?)(<!--.+?-->)(.*?<!\[endif\](|--)>)
Сделайте замену на том регулярном выражении, уехав \1\4 (или $1$ 4) как замена.
Я знаю, что это имеет.*? и. +? в нем см. мой комментарий к этому сообщению.
@Benoit
Маленькое Исправление (с включенной мультилинией):
"<!--\[if IE\]>.*?<!\[endif\]-->"
Я просто пошел бы с:
import re
html = """fjlk<wb>dsqfjqdsmlkf fdsijfmldsqjfl fjdslmfkqsjf<---- fdjslmjkqfs---><!--[if lt IE 7.]>\
<script defer type="text/javascript" src="pngfix_253168.js"></script><!--png fix for IE-->\
<![endif]-->fjlk<wb>dsqfjqdsmlkf fdsijfmldsqjfl fjdslmfkqsjf<---- fdjslmjkqfs--->"""
# here the black magic occurs (whithout '.')
clean_html = ''.join(re.split(r'<!--\[[^¤]+?endif]-->', html))
print clean_html
'fjlk<wb>dsqfjqdsmlkf fdsijfmldsqjfl fjdslmfkqsjf<---- fdjslmjkqfs--->fjlk<wb>dsqfjqdsmlkf fdsijfmldsqjfl fjdslmfkqsjf<---- fdjslmjkqfs--->'
N.B: [¤ ^] будет соответствовать любому символу, который не является '¤'. Это действительно полезно, так как это - молния быстро, и этот символ может быть найден на любой клавиатуре. Но прием, действительно трудно ввести (никто не введет его по ошибке), и никто не использует его: это - generical денежный символ завещания.
Если Вы не испытываете желание использовать ¤, однако, можно использовать chr (7) для генерации "системного символа" звонка, который является непечатным и не может быть найден в веб-странице ;-)
Не используйте регулярное выражение для этого. Вы запутаетесь о комментариях, содержащих открывающие тэги и что не, и делают неправильную вещь. HTML не является регулярным, и пытающийся изменить это с единственным регулярным выражением перестанет работать.
Используйте синтаксический анализатор HTML для этого. BeautifulSoup является хорошим, легким, гибким и крепким, который может обработать реальный (значение безнадежно поврежденного) HTML. С ним можно просто искать все узлы комментария, исследовать их содержание (можно использовать регулярное выражение для этого, если Вы желаете), и удалите их, если они должны быть удалены.
Это работает в Visual Studio 2005, где нет никакой опции промежутка строки:
\<!--\[if IE\]\>{.|\n}*\<!\[endif\]--\>