我无法理解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}<br/>Property Address: {PROP_ADDR}<br/>Tax Name: {TAX_NAME}<br/>Tax Address 1: {TAX_ADD_L1}<br/>Tax Address 2: {TAX_ADD_L2}<br/>Land Use: {USE1_DESC}<br/><a href="http://www16.co.hennepin.mn.us/pins/pidresult.jsp?pid={PID_NO}">View Property Information</a><br/><br/><br/>" 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)”的地方。我感谢任何帮助!谢谢!
答案 0 :(得分:1)
import re
t= ' <Layer DisplayName="Parcels (7-1-2010)" FeatureDescription="Owner Name: {OWNER_NAME}<br/>Property Address: {PROP_ADDR}<br/>Tax Name: {TAX_NAME}<br/>Tax Address 1: {TAX_ADD_L1}<br/>Tax Address 2: {TAX_ADD_L2}<br/>Land Use: {USE1_DESC}<br/><a href="http://www16.co.hennepin.mn.us/pins/pidresult.jsp?pid={PID_NO}">View Property Information</a><br/><br/><br/>" 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