<?php
$selfClosing = explode(',', 'area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed');
$html = '
<p><a href="#">foo</a></p>
<hr/>
<br/>
<div>name</div>';
$dom = new DOMDocument();
$dom->loadHTML($html);
$els = $dom->getElementsByTagName('*');
foreach ( $els as $el ) {
$nodeName = strtolower($el->nodeName);
if ( !in_array( $nodeName, $selfClosing ) ) {
var_dump( $nodeName );
}
}
Выход:
string(4) "html"
string(4) "body"
string(1) "p"
string(1) "a"
string(3) "div"
В основном просто определяют имена узлов узлов, которые закрываются самостоятельно, загружают всю строку html в библиотеку DOM, захватывают все элементы, перебирают и отфильтровывают которые не закрываются и не работают на них.
Я уверен, что вы уже знаете, что вам не следует использовать регулярное выражение для этой цели.
import pandas as pd
k=pd.DataFrame(['hello','doubt','hero','help'])
k.columns=['some_thing']
t=k[k['some_thing'].str.contains("hel")]
d=k.replace(t,'CS')
::: OUTPUT :::
k
Out[95]:
some_thing
0 hello
1 doubt
2 hero
3 help
t
Out[99]:
some_thing
0 hello
3 help
d
Out[96]:
some_thing
0 CS
1 doubt
2 hero
3 CS
Быстрое примечание: если вы хотите сделать выбор на основе частичной строки, содержащейся в индексе, попробуйте следующее:
df['stridx']=df.index
df[df['stridx'].str.contains("Hello|Britain")]
Вот что я сделал для частичных совпадений строк. Если у кого-то есть более эффективный способ сделать это, пожалуйста, дайте мне знать.
def stringSearchColumn_DataFrame(df, colName, regex):
newdf = DataFrame()
for idx, record in df[colName].iteritems():
if re.search(regex, record):
newdf = concat([df[df[colName] == record], newdf], ignore_index=True)
return newdf
Основываясь на проблеме github # 620 , похоже, что вы скоро сможете сделать следующее:
df[df['A'].str.contains("hello")]
Обновление: векторизованные строковые методы ( т.е. Series.str) доступны в pandas 0.8.1 и выше.
df[df['A'].str.contains("Hello|Britain")]
– Garrett
27 June 2013 в 20:20
df[df['value'].astype(str).str.contains('1234.+')]
для фильтрации столбцов без строкового типа.
– François Leblanc
13 February 2018 в 21:22
Как вы отфильтровываете «свободу», кроме как с такими критериями, как «наследие», «ulic» и т. д.
df_Fixed[~df_Fixed["Busler Group"].map(lambda x: x.startswith('Liberty'))]
Скажите, что у вас есть DataFrame
:
>>> df = pd.DataFrame([['hello', 'hello world'], ['abcd', 'defg']], columns=['a','b'])
>>> df
a b
0 hello hello world
1 abcd defg
Вы всегда можете использовать оператор in
в выражении лямбда для создания вашего фильтра.
>>> df.apply(lambda x: x['a'] in x['b'], axis=1)
0 True
1 False
dtype: bool
Трюк здесь состоит в том, чтобы использовать опцию axis=1
в apply
для передачи элементов в функцию лямбда по строкам, в отличие от столбца по столбцу.
Я использую pandas 0.14.1 на macos в ноутбуке ipython. Я попробовал предложенную строку выше:
df[df['A'].str.contains("Hello|Britain")]
и получил ошибку:
"cannot index with vector containing NA / NaN values"
, но она отлично работала, когда было добавлено условие «== Истина», например:
df[df['A'].str.contains("Hello|Britain")==True]
Если кто-нибудь задается вопросом, как выполнить связанную проблему: «Выбрать столбец частичной строкой»
Использовать:
df.filter(like='hello') # select columns which contain the word hello
И выбирать строки путем частичного совпадения строк, передать axis=0
для фильтрации:
# selects rows which contain the word hello in their index label
df.filter(like='hello', axis=0)