0

Python 3.3を使用して、正規表現の代用を作成しようとして失敗しました。

td属性を除くタグのすべての属性を削除したいrowspan最後のtdの例)。

rowspan次のコマンドを使用すると、存在する場合に正常に置換できます。

re.sub('(<td)[^>]*([\\s]rowspan[\\s]*=[\\s]*[0-9]*)[^>]*(>)', handle_td, file_contents)

どこにhandle_tdある:

def handle_td(matchobj):
    new_td = ''
    for curr_group in matchobj.groups(''):
        if curr_group != '':
            new_td += curr_group
    return new_td

tdしかし、私は残りの's の世話もしたいと思います。これは私が管理しませんでした。

2 番目のグループの後に追加すると、td タグが変更され、属性?が保持されません。rowspan

私は何を間違っていますか?どうすればこれを修正できますか?

他のコマンドを処理するために別のコマンドを実行することtdはありませんが、管理しませんでした...

<td width=307 valign=top style='width:230.3pt;border:solid windowtext 1.0pt; border-left:none;padding:0cm 5.4pt 0cm 5.4pt'>
<td width=307 rowspan=4 style='width:230.3pt;border:solid windowtext 1.0pt; border-top:none;padding:0cm 5.4pt 0cm 5.4pt'>
<td width=307 valign=top style='width:230.3pt;border-top:none;border-left: none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; padding:0cm 5.4pt 0cm 5.4pt'>

これにより、次が生成されます。

<td>
<td rowspan=4>
<td>

私はこの方法で管理しました(より良い方法がある場合は、自由に追加してください):

# Leave only specific attributes for td tags 
def filter_td_attributes(matchobj):
    if matchobj.group(1) == "rowspan":
        return matchobj.group(1) + '=' + matchobj.group(2)

# Loop the attributes of the td tags
def handle_td(matchobj):
    new_td = re.sub("([a-zA-Z]+)[\\s]*=[\\s]*([a-zA-Z0-9:;.\\-'\\s]*)([\\s]|>)", filter_td_attributes, matchobj.group(0))
    new_td = re.sub("[\\s]*$", '', new_td)
    new_td = new_td + ">" # close the td tag
    return new_td

file_contents = re.sub('[\\s]*</p>[\\s]*</td>', '</td>', file_contents)
4

1 に答える 1

0

行スパンコードがオプションの場合、コードの[^>]*一部を非貪欲にする必要があります: make it [^>]*?。全体として、次のようになります。

'(<td)[^>]*?([\\s]rowspan[\\s]*=[\\s]*[0-9]*)?[^>]*(>)'

貪欲なバージョン ( [^>]*) は、「>」以外の文字をできるだけ多くください。

貪欲でないバージョン ( [^>]*?) は、「正規表現全体を一致させながら、「>」以外の文字の数をできるだけ少なくする」ことを意味します。

于 2012-12-05T22:39:43.237 に答える