C++ 226 224224 222
I know I'm kinda late for the party, but this seemed like a fun problem and lack of entries using C-family languages bothered me.
So here's a C++ function using no regexp or string substitution, just some simple math:
void f(){char c;int o=0,i,j;while(cin>>c)c=='p'||c==80?cin.ignore(9,58):cin.unget(),cin>>i>>c&&c==45?cin>>j>>c&&(c=='e'||c=='o')?cin.ignore(9,44),c=='e'?i+=i&1,j+=!(j&1):(i+=!(i&1),j+=j&1),o+=(j-i)/2:(o+=j-i):0,++o;cout<<o;}
Ungolfed:
void f()
{
char c;
int o=0,i,j;
while(cin>>c)
c=='p'||c==80?cin.ignore(9,58):cin.unget(),
cin>>i>>c&&c==45?
cin>>j>>c&&(c=='e'||c=='o')?
cin.ignore(9,44),
c=='e'?
i+=i&1,j+=!(j&1)
:(i+=!(i&1),j+=j&1),
o+=(j-i)/2
:(o+=j-i)
:0,
++o;
cout<<o;
}
I didn't say it would be readable, now did I? :) Ternary operators are hell. I tried my best to (sort of) format it, though, so I hope it helps at least a little bit.
Usage:
#include <iostream>
using namespace std;
void f(){char c;int o=0,i,j;while(cin>>c)c=='p'||c==80?cin.ignore(9,58):cin.unget(),cin>>i>>c&&c==45?cin>>j>>c&&(c=='e'||c=='o')?cin.ignore(9,44),c=='e'?i+=i&1,j+=!(j&1):(i+=!(i&1),j+=j&1),o+=(j-i)/2:(o+=j-i):0,++o;cout<<o;}
int main()
{
f();
}