Python在字符串中查找模式

时间:2014-01-30 16:08:39

标签: python regex replace pattern-matching

我无法理解Python中的正则表达式模块。我认为我想要做的事情相当简单,但我无法理解。

我需要搜索一些xml文件并找到这种模式:

'DisplayName =“Parcels(10-1-2012)”'

我可以通过xml解析并使替换没有问题,我无法弄清楚的部分是如何进行外卡搜索以找到“Parcels(some-date-year)”的任何实例。由于日期会有所不同,我需要找到这种模式:

pat = '"Parcels (*-*-*)"' 

我想用今天的日期替换它,我可以用时间模块做。我复制了80个左右的xml文档中的一个,我需要找到这个模式。

根据re.search()函数的帮助,似乎我可以放入一个模式,然后是我希望搜索的字符串。但是,我收到了错误。

在模块中帮助进行功能搜索:

搜索(pattern,string,flags = 0)     扫描字符串寻找与模式的匹配,返回     匹配对象,如果未找到匹配则为None。

这是我的小测试片段:

import re
pat = '"Parcels (*-*-*)"'
t= '         <Layer DisplayName="Parcels (7-1-2010)" FeatureDescription="Owner Name: {OWNER_NAME}&lt;br/&gt;Property Address: {PROP_ADDR}&lt;br/&gt;Tax Name: {TAX_NAME}&lt;br/&gt;Tax Address 1: {TAX_ADD_L1}&lt;br/&gt;Tax Address 2: {TAX_ADD_L2}&lt;br/&gt;Land Use: {USE1_DESC}&lt;br/&gt;&lt;a href=&quot;http://www16.co.hennepin.mn.us/pins/pidresult.jsp?pid={PID_NO}&quot;&gt;View Property Information&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;" FeatureLabel="Parcel ID: {PID_NO}" IconUri="{RestVirtualDirectoryUrl}/Images/Parcel.png" Identifiable="true" IncludeInLayerList="true" IncludeInLegend="true" Name="Parcels" Searchable="true" ShowMapTips="true" UnconfiguredFieldsSearchable="true" UnconfiguredFieldsVisible="true" Visible="true">'
match = re.search(pat, t)
print match

大部分线都是垃圾,我不需要担心。我只需要看看如何在行中找到该日期,以便我可以在replace()函数中使用该片段。有谁知道我怎么能找到这些日期? xml中可能还有其他日期,但我不需要替换它们;就在它说“Parcels(some-date-year)”的地方。我感谢任何帮助!谢谢!

2 个答案:

答案 0 :(得分:1)

import re

t= '         <Layer DisplayName="Parcels (7-1-2010)" FeatureDescription="Owner Name: {OWNER_NAME}&lt;br/&gt;Property Address: {PROP_ADDR}&lt;br/&gt;Tax Name: {TAX_NAME}&lt;br/&gt;Tax Address 1: {TAX_ADD_L1}&lt;br/&gt;Tax Address 2: {TAX_ADD_L2}&lt;br/&gt;Land Use: {USE1_DESC}&lt;br/&gt;&lt;a href=&quot;http://www16.co.hennepin.mn.us/pins/pidresult.jsp?pid={PID_NO}&quot;&gt;View Property Information&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;" FeatureLabel="Parcel ID: {PID_NO}" IconUri="{RestVirtualDirectoryUrl}/Images/Parcel.png" Identifiable="true" IncludeInLayerList="true" IncludeInLegend="true" Name="Parcels" Searchable="true" ShowMapTips="true" UnconfiguredFieldsSearchable="true" UnconfiguredFieldsVisible="true" Visible="true">'

你需要逃避parens然后你可以更具体地说明内容,通用字符是.*表示0或更多:

pat = '"Parcels \(.*\)"'
match = re.search(pat, t)
print(match.group())

打印哪些:

"Parcels (7-1-2010)"

更具体的模式是:

pat = '"Parcels \([0-9]+-[0-9]+-[0-9]+\)"'
match = re.search(pat, t)
print(match.group())

打印哪些:

"Parcels (7-1-2010)"

这里,括号内容([0-9])统一描述0到9之间的所有数字(\d是等价的),加号+,跟随它们意味着大于0 ,破折号意味着自己。

答案 1 :(得分:1)

Aaron的答案很好,只需稍加修改就可以匹配你想要的东西(符合指定的数据格式)

import re

the_string = '<Layer DisplayName="Parcels (7-1-2010)" ... blablabla '
pattern = r'Parcels \(.*-.*-.*\)'
match = re.search(pattern, the_string)
print match.group()

此外,如果您怀疑字符串可能有多个匹配项,则可以使用findall方法打印所有匹配项。我还使用了\d+正则表达式,它只匹配字符串中的数字

import re

the_string = '<Layer DisplayName="Parcels (7-1-2011)" ... blablabla ... Layer DisplayName="Parcels (7-1-2012)" '
pattern = r'Parcels \(\d+-\d+-\d+\)'
all_matches = re.findall(pattern, the_string)
for match in all_matches:
  print match